纸上得来终觉浅,绝知此事要躬行。

 

C#自定义序列化反序列化与 ISerializable 接口

ISerializable 接口

MSDN注解:允许对象控制其自己的序列化和反序列化过程。

ISerializable 接口的定义:

public interface ISerializable
{
    void GetObjectData(SerializationInfo info, StreamingContext context);
}

意思就是我们可以通过实现 ISerializable 接口来控制序列化与反序列化后的结果。但是只有使用 BinaryFormatter 时才有用。使用 JavaScriptSerializer 类并没有效果。下面通过一个示例学习一下。

示例

定义实现 ISerializable 接口的类:

[Serializable]  //记得标记此 Attribute
public class Product : ISerializable
{
    private string _name;
    public Product() { }

    public Product(SerializationInfo info, StreamingContext context)
    {
        _name = (String)info.GetValue("Name", typeof(String));
    }

    public String Name
    {
        get { return this._name; }
        set { this._name = value; }
    }

    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        info.AddValue("Name", "JRoger.NET",typeof(String));
    }
}

 通过 BinaryFormatter 序列化和反序列化此类:

[Test]
public void SerializableTest()
{
    var product = new Product { Name = "Hello" };
    var formatter = new BinaryFormatter();
    var stream = File.Open(@"E:\Log.bin", FileMode.OpenOrCreate, FileAccess.ReadWrite);

    formatter.Serialize(stream, product);

    stream.Close();
    stream.Dispose();

    var obj = (Product)formatter.Deserialize(File.Open(@"E:\Log.bin", FileMode.OpenOrCreate, FileAccess.ReadWrite));

    Trace.WriteLine(obj.Name);
}

 可以看到,实例化 Product 类时,Name 属性的值为 "Hello" 而反序列化后输出结果却为 "JRoger.NET"。其实控制序列化和反序列化结果的关键就是实现 ISerializable 接口。另外实现 ISerializable 接口的类还要有一个带有两个参数的构造函数,这两个参数的类型分别为: SerializationInfoStreamingContext 。

总结

总的来说实现上很简单,配上示例也很容易。但是使用自定义序列化和反序列化的场景可能并不多。不过作为学习内容还是很有必要的。使用场景少,并不代表没有。不要放过任何细节。

posted on 2013-09-07 18:46  JRoger  阅读(6556)  评论(0编辑  收藏  举报

导航