【.NET序列化和反序列化】基本篇

.Net中的序列化方法有三种:

(1) 二进制序列化(注:序列化生成的是二进制文件)

(2)SOAP 序列化(注:序列化生成的是xml文件)

(3)XML 序列化  (注:序列化生成的是xml文件)

序列化相关的两个类型:

SerializableAttribute:指示一个类是可以序列化的,缩略写法 [Serializable]。
ISerializable:使对象可以自己控制其序列化和反序列化的过程。

对比三种序列化方法:

实例演示:

创建一个序列化对象类

 [Serializable]
    public class MyObject
    {
        /// <summary>
        /// 出生地
        /// </summary>
        public string homeplace
        {
            get;

            set;
        }

        /// <summary>
        /// 出生日期
        /// </summary>
        public DateTime birthday
        {
            get;
            set;
        }

        /// <summary>
        /// 姓名
        /// </summary>
        public string name
        {
            get;
            set;
        }

        /// <summary>
        /// 年龄
        /// </summary>
        public int age
        {
            get;
            set;
        }

        /// <summary>
        /// 重写了ToString()方法
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            return string.Format("姓名:{0},生日:{1},出生地:{2},年龄:{3}",name,birthday,homeplace,age);
        }
    }

序列化方法:

 /// <summary>
        /// 二进制序列化对象
        /// </summary>
        /// <param name="obj"></param>
        public static void BinarySerialize(MyObject obj)
        {
            using (FileStream stream = new FileStream("c://myobject.txt", FileMode.Create, FileAccess.Write))
            {
                BinaryFormatter formater = new BinaryFormatter();
                formater.Serialize(stream, obj);
                Console.WriteLine("对象已经被序列化\r\n" + obj.ToString());
            }
        }

        /// <summary>
        /// 二进制反序列化对象
        /// </summary>
        /// <param name="obj"></param>
        public static void BinaryDeSerialize(string filename)
        {
            using (FileStream stream = new FileStream(filename, FileMode.Open, FileAccess.Read))
            {
                BinaryFormatter formater = new BinaryFormatter();
                MyObject obj = (MyObject)formater.Deserialize(stream);
                Console.WriteLine("对象已经被反序列化\r\n" + obj.ToString());
            }
        }

        /// <summary>
        /// soap序列化对象
        /// </summary>
        /// <param name="obj"></param>
        public static void SoapSerialize(MyObject obj)
        {
            using (FileStream stream = new FileStream("c://myobject.txt", FileMode.Create, FileAccess.Write))
            {
                SoapFormatter formater = new SoapFormatter();
                formater.Serialize(stream, obj);
                Console.WriteLine("对象已经被序列化\r\n" + obj.ToString());
            }
        }

        /// <summary>
        /// soap反序列化对象
        /// </summary>
        /// <param name="filename"></param>
        public static void SoapDeSerialize(string filename)
        {
            using (FileStream stream = new FileStream(filename, FileMode.Open, FileAccess.Read))
            {
                SoapFormatter formater = new SoapFormatter();
                MyObject obj = (MyObject)formater.Deserialize(stream);
                Console.WriteLine("对象已经被反序列化\r\n" + obj.ToString());
            }
        }

        /// <summary>
        /// xml序列化对象
        /// </summary>
        /// <param name="obj"></param>
        public static void XmlSerialize(MyObject obj)
        {
            using (FileStream stream = new FileStream("c://myobject.xml", FileMode.Create, FileAccess.Write))
            {
                XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
                serializer.Serialize(stream, obj);
                Console.WriteLine("对象已经被序列化\r\n" + obj.ToString());
            }
        }
        /// <summary>
        /// xml反序列化对象
        /// </summary>
        /// <param name="filename"></param>
        public static void XmlDeSerialize(string filename)
        {
            using (FileStream stream = new FileStream(filename, FileMode.Open, FileAccess.Read))
            {
                XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
                MyObject obj = (MyObject)serializer.Deserialize(stream);
                Console.WriteLine("对象已经被反序列化\r\n" + obj.ToString());
            }
        }

序列化方法调用:

static void Main(string[] args)
        {
            MyObject obj = new MyObject();
            obj.name = "XXX";
            obj.birthday = Convert.ToDateTime("2012-12-12");
            obj.homeplace = "广东省深圳市";
            obj.age = 23;

            Console.WriteLine("************使用BinaryFormatter进行序列化和反序列化***************");
            BinarySerialize(obj);
            BinaryDeSerialize("c://myobject.txt");
            Console.WriteLine("******************************************************************\r\n\r\n");
            Console.WriteLine("************使用SoapFormatter进行序列化和反序列化*****************");
            SoapSerialize(obj);
            SoapDeSerialize("c://myobject.txt");
            Console.WriteLine("******************************************************************\r\n\r\n");
            Console.WriteLine("************使用XmlFormatter进行序列化和反序列化******************");
            XmlSerialize(obj);
            XmlDeSerialize("c://myobject.xml");
            Console.WriteLine("******************************************************************\r\n\r\n");

        }

运行结果:

posted @ 2012-06-19 11:41  说不清这一切  阅读(320)  评论(0编辑  收藏  举报