自定义的序列化过程
最近,由于对象进行了扩展,原来序列化保存的东西都无法用了,于是考虑自定义的序列化.
在实现ISerializable接口进行自定义的序列化中,最初我还纳闷那些const字段或者static字段的值需不需要在序列化的构造函数中赋值.
试了一下,发现自定义的序列化的时候,会进行类的构造.而自动的序列化则不会.
看以下例子:
public class TestClass
{
[NonSerialized]
private float fa=1.0f;
private ArrayList ary=new ArrayList();
public TestClass()
{
ary.Add(0);
ary.Add(1);
ary.Add("0");
}
}
很显然,反序列化后生成的实例,fa字段为0f;
如果我们实现ISerializable接口.
public class TestClass:ISerializable
{
[NonSerialized]//这时候,这个属性标识作用已经被忽略,失去了实际作用.
private float fa=1.0f;
private ArrayList ary=new ArrayList();
public TestClass()
{
ary.Add(0);
ary.Add(1);
ary.Add("0");
}
#region ISerializable 成员
protected TestClass(SerializationInfo info,StreamingContext context)
{
ary=info.GetValue("ary",typeof(ArrayList)) as ArrayList;
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
// TODO: 添加 TestClass.GetObjectData 实现
info.AddValue("ary",ary,ary.GetType());
}
#endregion
}
通过单步跟踪,可以发现,在反序列化的时候,实际的构造过程是
1-->private float fa=1.0f;
2-->private ArrayList ary=new ArrayList();
3-->执行ary=info.GetValue....
所以,自定义的序列化过程比自动的序列化灵活很多,完全可以帮助我们完成同一对象的不同版本的存取工作.
最近,由于对象进行了扩展,原来序列化保存的东西都无法用了,于是考虑自定义的序列化.
在实现ISerializable接口进行自定义的序列化中,最初我还纳闷那些const字段或者static字段的值需不需要在序列化的构造函数中赋值.
试了一下,发现自定义的序列化的时候,会进行类的构造.而自动的序列化则不会.
看以下例子:
public class TestClass
{
[NonSerialized]
private float fa=1.0f;
private ArrayList ary=new ArrayList();
public TestClass()
{
ary.Add(0);
ary.Add(1);
ary.Add("0");
}
}
很显然,反序列化后生成的实例,fa字段为0f;
如果我们实现ISerializable接口.
public class TestClass:ISerializable
{
[NonSerialized]//这时候,这个属性标识作用已经被忽略,失去了实际作用.
private float fa=1.0f;
private ArrayList ary=new ArrayList();
public TestClass()
{
ary.Add(0);
ary.Add(1);
ary.Add("0");
}
#region ISerializable 成员
protected TestClass(SerializationInfo info,StreamingContext context)
{
ary=info.GetValue("ary",typeof(ArrayList)) as ArrayList;
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
// TODO: 添加 TestClass.GetObjectData 实现
info.AddValue("ary",ary,ary.GetType());
}
#endregion
}
通过单步跟踪,可以发现,在反序列化的时候,实际的构造过程是
1-->private float fa=1.0f;
2-->private ArrayList ary=new ArrayList();
3-->执行ary=info.GetValue....
所以,自定义的序列化过程比自动的序列化灵活很多,完全可以帮助我们完成同一对象的不同版本的存取工作.