现在的位置: 首页 > 综合 > 正文

自定义序列化

2013年06月14日 ⁄ 综合 ⁄ 共 1298字 ⁄ 字号 评论关闭
  • 在编写代码的过程中,我们有可能并不希望将对象的所有属性都序列化,这时就需要自定义序列化,在.NET中自定义序列化需要继承ISerializable接口:
        public interface ISerializable
        {
            
    void GetObjectData(SerializationInfo info, StreamingContext context);
        }
  • 这个接口只有一个方法,通过这个方法我们可以将需要序列化的数据序列化。
    info:存储将对象序列化或反序列化所需的全部数据。
    context:描述给定的序列化流的源和目标,并提供一个由调用方定义的附加上下文。
  • 对象序列化后,当再次需要使用对象时,我们就需要反序列化,反序列化需要下面这个特殊的构造函数:
            protected <类名>(SerializationInfo info, StreamingContext context){}
  • 具体如何序列化和反序列化呢?这就需要到了info对象的AddValue()GetValue()
    AddValue()向 SerializationInfo 中添加一个值。
    GetValue()从 SerializationInfo 存储区中检索一个值。
  • 在要序列化的时候我们通过AddValue()方法往info中填充数据,序列化程序将保存在info中的数据进行序列化。而当要反序列化的时候,我们从info中用GetValue()将数据取出,赋值给对应的属性。info中还有许多GetXXX()类型安全的方法,例如:GetInt32()
  • 具体实例:
        [Serializable]
        
    public class CustomSerialization : ISerializable
        {
            
    public CustomSerialization() { }
            
    public string Name { getset; }
            
    public int Age { getset; }
            
    #region ISerializable 成员
            
    public void GetObjectData(SerializationInfo info, StreamingContext context)
            {
                info.AddValue(
    "Name", Name);
                info.AddValue(
    "Age", Age);
            }
            
    #endregion
            
    protected CustomSerialization(SerializationInfo info, StreamingContext context)
            {
                Name 
    = info.GetString("Name");
                Age 
    = info.GetInt32("Age");
            }
        }

抱歉!评论已关闭.