在.NET 1.x使用自定义序列化时的一个技巧
在前面提到,.NET 1.x提供的自定义序列化的solution很不方便。不过,IMPOSSIBLE IS NOTHING,我们可以写两个辅助方法来绕过这个问题。![]()
class SerializationHelper
{
public static void Serialize(object obj, SerializationInfo info, StreamingContext context)
{
MemberInfo[] members = FormatterServices.GetSerializableMembers(obj.GetType(), context);
foreach(FieldInfo field in members)
{
info.AddValue(field.Name, field.GetValue(obj), field.FieldType);
}
}
![]()
public static void Deserialize(object obj, SerializationInfo info, StreamingContext context)
{
MemberInfo[] members = FormatterServices.GetSerializableMembers(obj.GetType(), context);
foreach(FieldInfo field in members)
{
field.SetValue(obj, info.GetValue(field.Name, field.FieldType));
}
}
}
如果你已经看明白了我的意图,那就不必往下看了。![]()
下面是利用了这个SerializationHelper的自定义序列化方案:
[Serializable]
class Person : ISerializable
{
// public field
public string Name = "Vista Xia";
// private field
private int age = 23;
// public property (no use in serialization)
public int Age
{
get { return age; }
set { age = value; }
}
[NonSerialized]
public string Award;
// event/delegate
public event EventHandler Birthday;
![]()
public Person()
{
Award = "MVP";
}
![]()
protected Person(SerializationInfo info, StreamingContext context)
{
SerializationHelper.Deserialize(this, info, context);
Award = "MVP";
}
![]()
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
SerializationHelper.Serialize(this, info, context);
}
}
加上前面提到的background,就很容易理解了嗯。![]()
注意:
这个不是微软官方提供的方案,我也不提供技术支持。我只能说这个应该是可行的,我自己做了不少测试也证明了这一点,但是,万一出了问题可不要怪俺。
2006年4月4日 11:59





}
}
浙公网安备 33010602011771号