C#:xml序列化与反序列化

xml序列化与反序列化

一.概述

序列化是将一个对象(object)转换成容易传输的形式,可以理解成解释。反序列化的过程正好相反。例如在客户端和服务器端需要传输一个object对象,那么就可以在服务器端将这个对象先序列化成流形式,在传递给客户端,客户端在接收到流后,在进行反序列化的过程,重构object。
xml序列化只能转换public成员(字段)和可读写属性,不可以转换方法,索引,私有成员(字段)或者只读属性。所以为了序列化object所有的public或者private成员,方法和属性,可以使用DataContractSerializer来代替XML序列化。这节内容就不讲DataContractSerializer了。

二.举例说明

这里我只举例说明如何转换类对象,需要注意的是只能转换public object。
首先是Person类,就是我们需要序列化与反序列化的对象,是一个public类。

    public class Person 
    {
        public Person(){}
        public Person(string name, int age, string job)
        {
            this.name = name;
            this.age = age;
            this.job = job;
        }
        public string name;
        public int age;
        private string job;
        public string GetJob() { return job; }
    }

然后是序列化与反序列化操作。先构建XmlSerializer对象,然后借助该对象的Serialize方法和Deserialize方法进行序列化与反序列化。

       static void SerializationPerson(string file)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(Person));
            TextWriter writer = new StreamWriter(file);
            Person twj = new Person("唐维娟", 25, "建筑师");
            serializer.Serialize(writer, twj);
            writer.Close();
        }

        static void DeserializationPerson(string file)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(Person));
            FileStream fs = new FileStream(file, FileMode.Open);
            Person twj = new Person();
            twj = (Person)serializer.Deserialize(fs);
            Console.WriteLine("姓名:" + twj.name);
            Console.WriteLine("年龄:" + twj.age);
            Console.WriteLine("职业:" + twj.GetJob());
        }

调用执行:

      static void Main(string[] args)
        {
            SerializationPerson("C:/Users/a/Desktop/test.txt");
            DeserializationPerson("C:/Users/a/Desktop/test.txt");
        }

下面是结果:
在这里插入图片描述
在这里插入图片描述
从结果中可以看出,Person的私有成员job并没有被序列化,从而造成数据丢失。如果想要序列化私有成员,需要使用DataContractSerializer。
xml序列化,不仅能序列化类对象,还可以序列化DataSet,XmlElement和XmlNode等等,如果想进一步学习可以参考微软官方文档。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章