在C#中创建新的类型时最好让这个类型支持序列化,尤其是你的这个类型要提供给别的程序员使用的时候。而在C#中使你的类型支持序列化是非常简单的事情,使用[Serializable]属性就可以了:
[Serializable]
public class MyType
{
private string _label;
private int _value;
}
当你的类中的成员变量是基本类型时,他们自动支持序列化;但如果成员变量中使用了其他新的类,那么这个类变量自己就必须要支持序列化,这就是为什么当我们自己设计新的类时要支持序列化的原因。
有时候某些变量只是储存的中间结果,那我们的确不需要对这些变量进行序列化,这时我们可以使用[NonSerialized]属性:
[Serializable]
public class MyType
{
private string _label;
[NonSerialized]
private int _cachedValue;
private OtherClass _object;
}
而这样就需要我们做更多的事情了,例如在deserialization的过程中就要考虑初始化这些变量的问题,这时就要通过实现IDeserializationCallback接口的OnDeserialization方法来做这些事情。
另外,如果我们的类在发布之后又做了修改,加入了新的成员变量,那么为了和以前已经序列化的实例兼容,我们就不得不做更多的事情。例如,更新后的一个类定义如下:
[Serializable]
public class MyType
{
private string _label;
[NonSerialized]
private int _value;
private OtherClass _object;
// Added in version 2
// The runtime throws Exceptions
// with it finds this field missing in version 1.0
// files.
private int _value2;
}
为了处理新的变量_value2,我们要实现ISerializable接口
using System.Runtime.Serialization;
using System.Security.Permissions;
[Serializable]
public sealed class MyType : ISerializable
{
private string _label;
[NonSerialized]
private int _value;
private OtherClass _object;
private const int DEFAULT_VALUE = 5;
private int _value2;
// public constructors elided.
// Private constructor used only by the Serialization
framework.
private MyType( SerializationInfo info,
StreamingContext cntxt )
{
_label = info.GetString( "_label" );
_object = ( OtherClass )info.GetValue( "_object", typeof
( OtherClass ));
try {
_value2 = info.GetInt32( "_value2" );
} catch ( SerializationException e )
{
// Found version 1.
_value2 = DEFAULT_VALUE;
}
}