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


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

posted @ 2008-11-21 10:25  roboth  阅读(242)  评论(0)    收藏  举报