尽可能将类型实现为可序列化的类型

using System;
using System.IO;//MemoryStream
using System.Runtime.Serialization.Formatters.Binary;//BinaryFormatter
using System.Runtime.Serialization;
using System.Security.Permissions;
[Serializable]
public class MyType : IDeserializationCallback,ISerializable
{
private string _label;
private int _value;
[NonSerialized]
private int _tmp; //0 or Null
//2.0 version
private int _value2;
private const int DEFAULT_VALUE = 5;
#region IDeserializationCallback 成员
public void OnDeserialization(object sender)
{
_tmp = 100;
}
#endregion
protected MyType(SerializationInfo info, StreamingContext context)
{
_label = info.GetString("_label");
_value = info.GetValue("_value", typeof(int));
try
{
_value2 = info.GetInt32("_value2");
}
catch(SerializationException exq)
{
_value2 = DEFAULT_VALUE;
}
}
#region ISerializable 成员
[SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true]
void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
{
//顺序、变量名..
info.AddValue("_label", _label);
info.AddValue("_value", _value);
info.AddValue("_label", _label);
info.AddValue("_value2", _value2);
this.GetObjectData(info, context);
}
protected void GetObjectData(SerializationInfo info, StreamingContext context)
{
//codehea
}
#endregion
}
public class DerivedType : MyType
{
private int _DerivedVal;
private DerivedType ( SerializationInfo info,
StreamingContext cntxt ) :
base( info, cntxt )
{
_DerivedVal = info.GetInt32( "_DerivedVal" );
}
protected override void WriteObjectData(
SerializationInfo inf,
StreamingContext cxt )
{
inf.AddValue( "_DerivedVal", _DerivedVal );
}
}