chiname

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

在.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
posted on 2006-05-12 17:16  把我的欢乐带给你  阅读(117)  评论(0)    收藏  举报