自定义序列化
- 在编写代码的过程中,我们有可能并不希望将对象的所有属性都序列化,这时就需要自定义序列化,在.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 { get; set; }
public int Age { get; set; }
#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");
}
}