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 接口的类还要有一个带有两个参数的构造函数,这两个参数的类型分别为: SerializationInfo 和 StreamingContext 。
总结
总的来说实现上很简单,配上示例也很容易。但是使用自定义序列化和反序列化的场景可能并不多。不过作为学习内容还是很有必要的。使用场景少,并不代表没有。不要放过任何细节。
本博客内容,如需转载请务必保留超链接。Contact Me:Mail此处省略好几个字...