을 약간 다른 노트에 ?
참조 : 직렬화 중에 BinaryFormatter는 FormatterServices 클래스의 메서드를 호출합니다.
private static bool CheckSerializable(RuntimeType type)
{
return type.IsSerializable;
}
이 코드와 유사에 :
Type t = typeof (SomeClass);
bool isTypeSerializable = t.IsSerializable;
if (!CheckSerializable(type))
{
throw new SerializationException(Environment.GetResourceString("Serialization_NonSerType", new object[] { type.FullName, type.Module.Assembly.FullName }));
}
이 FormatterServices 클래스의 CheckSerializable 방법을 확인할 수 있습니다 : 그들 중 하나는
private static MemberInfo[] InternalGetSerializableMembers(RuntimeType type)
이 방법은 다음 코드가 포함되어 있습니다
이 예에서는 SomeClass 클래스에 SerializableAttribute가 있으면 isTypeSerializable은 true입니다. 그렇지 않으면 거짓.
Soo ... 간단한 대답 :이 속성은 플래그이며 이는 클래스의 인스턴스를 일련 번호로 나타낼 수 있음을 나타냅니다. 그래서 그것은 단지 필요했습니다.
주 질문에 대해서는 :
아쉽게도 실버 라이트 어셈블리에 정의 된 클래스의 경우 이진 형식화 프로그램을 직접 사용할 수 없습니다.
프록시 클래스를 사용하는 한 가지 방법.
예 : 귀하의 실버 어셈블리 내부
등급 : 실버 조립을 참조하여 일반적인 .NET의 assemly 내부 직렬화를 지원
public class SomeClass
{
public int IntValue { get; set; }
public string StringValue { get; set; }
public bool BoolValue { get; set; }
}
Proxy 클래스 : 그래서 당신의 ASP에
[Serializable]
public class SomeClassProxy
{
public int IntValue { get; set; }
public string StringValue { get; set; }
public bool BoolValue { get; set; }
public static SomeClassProxy GetSerializableObject(SomeClass silverlightClass)
{
return new SomeClassProxy
{
IntValue = silverlightClass.IntValue,
StringValue = silverlightClass.StringValue,
BoolValue = silverlightClass.BoolValue
};
}
public static SomeClass DeserializeSilverlightCompatible(Stream stream)
{
BinaryFormatter formatter = new BinaryFormatter();
SomeClassProxy proxy = formatter.Deserialize(stream) as SomeClassProxy;
return new SomeClass
{
IntValue = proxy.IntValue,
StringValue = proxy.StringValue,
BoolValue = proxy.BoolValue
};
}
}
.그물이나 윈폼 응용 프로그램은 프록시 클래스로 작동한다 :
는
using(MemoryStream memoryStream = new MemoryStream())
{
BinaryFormatter formatter = new BinaryFormatter();
//create instance of silverlight class
SomeClass mySilverlightClass = new SomeClass();
mySilverlightClass.IntValue = 555;
mySilverlightClass.StringValue = "Hello World!";
mySilverlightClass.BoolValue = true;
//<===serialize and take care of silverlight instance
formatter.Serialize(memoryStream, SomeClassProxy.GetSerializableObject(mySilverlightClass));
memoryStream.Seek(0, SeekOrigin.Begin);
//===>deserialize to silverlight instance
SomeClass mySilverlightClassRestored = SomeClassProxy.DeserializeSilverlightCompatible(memoryStream);
}
그래서이 프록시는 직렬화 및 역 직렬화 (직렬화 복원 후 실버 어셈블리에 정의 된 클래스 SomeClass의 인스턴스를받을 수 있습니다)에서 모두 처리합니다. 바이너리 포맷 소프트 rescriction 인 경우
그럼 내가 대신 XML 시리얼 라이저를 사용하는 것이 좋습니다 수 있습니다
XmlSerializer s = new XmlSerializer(typeof(SomeClass));
s.Serialize(memoryStream, mySilverlightClass);
memoryStream.Seek(0, SeekOrigin.Begin);
SomeClass restored = s.Deserialize(memoryStream) as SomeClass;
그것은 그 경우의 SerializableAttribute은 필요하지 않습니다.
은 바이너리 직렬화가 엄격히 필요합니까? 사실 데이터를 직렬화하고 Silverlight 응용 프로그램과 ASP.NET 페이지에서 사용하는 가장 일반적인 방법은 JSON 직렬화입니다. –
@zenonych - 내 실버 라이트 애플 리케이션에서 이진 직렬화 개체를 찾고 아니에요. pls 내 질문을 확인 편집 좀 더 정보를 추가했습니다. –
나는 나의 대답을 바꾸었다. 다시 보아라. –