C#序列化
研究了几天序列化的问题,就是想把页面上的一个button对象记录下来保存到本地~~
终于研究出成果了,记录下此刻愉快的心情,和成长道路上的一笔;
查C#官方MSDN,说明是:序列化要求实现接口ISerializable;
然而自己随便写个很普通的类,搞几个属性,调用soap的Serialize也可以序列化,在使用Deserialize可以完全还原;
问题是button对象,就不能像自己随便写的那个类一样去序列化,会报异常,在网上也搜了很久这个异常的原因和解决办法,无果~~
推测原因大致来自于,button里面可能会有复杂的属性;
这样我绕来绕去,设计了很多办法来保存button,比如写个类继承button,再在里面添加一个可以序列化的普通类以作保存属性;
弄来弄去,总感觉写的很不好,实现的很糟糕~~
最后还是决定按照MSDN的去做,因为MSDN说了,只要继承接口就能序列化,所以button肯定也有它的序列化方法~~
于是实现了2个方法:
// Implement this method to serialize data. The method is called
// on serialization.
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
// Use the AddValue method to specify serialized values.
info.AddValue("Location", Location, typeof (Point));
}
// The special constructor is used to deserialize values.
public WordControl(SerializationInfo info, StreamingContext context)
{
// Reset the property value using the GetValue method.
Location = (Point) info.GetValue("Location", typeof (Point));
}
这是在MSDN抄来的,稍微改了点变量名,这里写个类
class mybtn:Button,ISerializable
{
}
里面写入这2个方法,再使用MSDN提供的序列化方法
public static void SerializeItem(string fileName, object obj)
{
IFormatter formatter = new BinaryFormatter();
FileStream s = new FileStream(fileName, FileMode.Create);
formatter.Serialize(s, obj);
s.Close();
}
public static object DeserializeItem(string fileName)
{
IFormatter formatter = new BinaryFormatter();
FileStream s = new FileStream(fileName, FileMode.Open);
var t = formatter.Deserialize(s);
return t;
}
搞定啦~~
因为前面info.AddValue("Location", Location, typeof (Point));只保存了Location属性,所以这里序列化也只保存了Location属性,如果要保存更多属性,就实现更多的AddValue和GetValue~~