Serializing a Type as a different type and deserializing an object as a different object
下面的代码是序列化一个Singleton类并反序列化
[Serializable]
public sealed class SingletonSerializable:ISerializable
{
private SingletonSerializable()
{
}
private static readonly SingletonSerializable theOneObject=new SingletonSerializable();
public string Name="Jeff";
public DateTime Date = DateTime.Now;
public static SingletonSerializable GetSingleton()
{
return theOneObject;
}
[SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)]
void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
{
info.SetType(typeof(SingletonSerializationHelper));
//Tell the formatter to serialize the SingletonSerializable object as a SingletonSerializableHelper object instead.
//The formatter automatically detected that both array elements refer to a single object, the formatter serialize only one object.
//So the formatter no need the special constructor
}
[Serializable]
//When a type implements IObjectReference, the formatter calls the GetRealObject method
private sealed class SingletonSerializationHelper:IObjectReference
{
public Object GetRealObject(StreamingContext context)
{
return SingletonSerializable.GetSingleton();
//Return a reference to the object that you really want a reference to now that deserialization of the object has completed.
}
}
}
test
public static void TestSingleton()
{
SingletonSerializable[] al = { SingletonSerializable.GetSingleton(),SingletonSerializable.GetSingleton()};
Console.WriteLine("Do both elements refer to the same object?"+(al[0]==al[1]));//True
using (Stream st = new MemoryStream()) {
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(st,al);
st.Position = 0;
SingletonSerializable[] a2 =(SingletonSerializable[]) formatter.Deserialize(st);
Console.WriteLine("Do both elements refer to the same object?"+(a2[0]==a2[1]));//True
Console.WriteLine("Do both elements refer to the same object?"+(al[0]==a2[0]));//True
}
}