WEB开发网
开发学院软件开发C语言 Effective C# 原则25: 让你的类型支持序列化 阅读

Effective C# 原则25: 让你的类型支持序列化

 2009-02-19 08:16:24 来源:WEB开发网   
核心提示: using System.Runtime.Serialization;using System.Security.Permissions;[Serializable]public class MyType : ISerializable{private string _label;[Non

using System.Runtime.Serialization;
using System.Security.Permissions;
[Serializable]
public 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.
 // Protected constructor used only by the Serialization
    framework.
 protected 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;
  }
 }
 [ SecurityPermissionAttribute( SecurityAction.Demand,
  SerializationFormatter =true ) ]
 void ISerializable.GetObjectData(
  SerializationInfo inf,
  StreamingContext cxt )
 {
  inf.AddValue( "_label", _label );
  inf.AddValue( "_object", _object );
  inf.AddValue( "_value2", _value2 );
  WriteObjectData( inf, cxt );
 }
 // Overridden in derived classes to write
 // derived class data:
 protected virtual void
  WriteObjectData(
  SerializationInfo inf,
  StreamingContext cxt )
 {
 }
}

一个派生类应该提供它自己的序列化构造函数,并且重载WriteObjectData方法:

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

从流中写入和读取值的顺序必须保持一致。我相信先读写基类的数据应该简单一些,所以我就这样做了。如果你写的代码不对整个继承关系进行精确的顺序序列化,那么你的序列化代码是无效的。

.Net框架提供了一个简单的方法,也是标准的算法来支持对象的序列化。如果你的类型须要持久,你应该遵守这个标准的实现。如果你的类型不支持序列化,那化其它使用这个类的类也不能序列。为了让使用类的客户更加方便,尽可能的使用默认序列化特性,并且在默认的特性不满足时要实现ISerializable 接口。

上一页  1 2 3 4 5 6 

Tags:Effective 原则 类型

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接