Serialization in C#

来源:互联网 发布:易语言整人关机源码 编辑:程序博客网 时间:2024/05/16 05:07

在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;
    }
  }

原创粉丝点击