序列化的使用技巧
在VS2003中用BinaryFormater来序列化一个对象时会有这样的情况存在。从一时期版本的已序列化对象进行对象创建时会因字段的增加而出现异常。通过查阅MSDN可以得知通过自定义序列化处理。
在将对象序列化之前,最好先做下面的事情,将聚合的对象尽量置空(null)否则序列化后的结果可能会很大!将事件置空!否则序列化过程中要求事件订阅者的元数据(即元数据也要序列化)。
在VS2003中序列化从CollectionBase继承的类时会产生问题,解决的办法是实现其索引器方法。
对多维数组直接进行XML序列化时也会出现问题,解决的办法是将其转换为数组的数组。
下面是自定义序列化的实现方法:(2005 VS.net 已经提供了类似的功能,不需要现这样做了:))
public class Serialize
{
public static void DoSerialize(SerializationInfo info, StreamingContext context,object obj)
{
foreach(FieldInfo fi in obj.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance))
{
try // 一定要放于foreach的里边,否则会丢失成员信息
{
string s = fi.Name;
object o = fi.GetValue(obj);
info.AddValue(s,o);
}
catch(Exception e)
{
MessageBox.Show(e.ToString());
}
}
}
public static void DeSerialize(SerializationInfo info, StreamingContext context, object obj)
{
foreach(FieldInfo fi in obj.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance))
{
try // 一定要放于foreach的里边,否则会丢失成员信息
{
string s = fi.Name;
object o = info.GetValue(s,fi.FieldType);
fi.SetValue(obj,o);
}
catch(Exception){}
}
}
public static byte[] ToBytes(object obj)
{
try
{
// 进行序列化操作
MemoryStream ms = new MemoryStream();
BinaryFormatter serializer = new BinaryFormatter();
serializer.Serialize(ms,obj);
return ms.ToArray();
}
catch(Exception e)
{
MessageBox.Show(e.ToString());
return null;
}
}
public static object ToObject(byte[] ary)
{
try
{
// 进行反序列化操作
MemoryStream ms = new MemoryStream(ary);
ms.Position = 0;
BinaryFormatter serializer = new BinaryFormatter();
return serializer.Deserialize(ms);
}
catch(Exception e)
{
MessageBox.Show(e.ToString());
return null;
}
}
}
使用的例子如下:{
public static void DoSerialize(SerializationInfo info, StreamingContext context,object obj)
{
foreach(FieldInfo fi in obj.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance))
{
try // 一定要放于foreach的里边,否则会丢失成员信息
{
string s = fi.Name;
object o = fi.GetValue(obj);
info.AddValue(s,o);
}
catch(Exception e)
{
MessageBox.Show(e.ToString());
}
}
}
public static void DeSerialize(SerializationInfo info, StreamingContext context, object obj)
{
foreach(FieldInfo fi in obj.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance))
{
try // 一定要放于foreach的里边,否则会丢失成员信息
{
string s = fi.Name;
object o = info.GetValue(s,fi.FieldType);
fi.SetValue(obj,o);
}
catch(Exception){}
}
}
public static byte[] ToBytes(object obj)
{
try
{
// 进行序列化操作
MemoryStream ms = new MemoryStream();
BinaryFormatter serializer = new BinaryFormatter();
serializer.Serialize(ms,obj);
return ms.ToArray();
}
catch(Exception e)
{
MessageBox.Show(e.ToString());
return null;
}
}
public static object ToObject(byte[] ary)
{
try
{
// 进行反序列化操作
MemoryStream ms = new MemoryStream(ary);
ms.Position = 0;
BinaryFormatter serializer = new BinaryFormatter();
return serializer.Deserialize(ms);
}
catch(Exception e)
{
MessageBox.Show(e.ToString());
return null;
}
}
}
[Serializable()]
public class ProjectOptions : ISerializable
{
// 成员声明
\ …
// 下面这一行是必须的,即使没有内容也要有一个构造函数
public ProjectOptions() {}
#region ISerializable 成员
public ProjectOptions(SerializationInfo info, StreamingContext context)
{
Serialize.DeSerialize(info,context,this);
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
Serialize.DoSerialize(info,context,this);
}
#endregion
}
public class ProjectOptions : ISerializable
{
// 成员声明
\ …
// 下面这一行是必须的,即使没有内容也要有一个构造函数
public ProjectOptions() {}
#region ISerializable 成员
public ProjectOptions(SerializationInfo info, StreamingContext context)
{
Serialize.DeSerialize(info,context,this);
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
Serialize.DoSerialize(info,context,this);
}
#endregion
}