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~~

 

 

posted on 2014-01-09 23:16  慈方阳  阅读(180)  评论(0编辑  收藏  举报

导航