• XML序列化和反序列化(C#)


    主要参考资料:

    http://www.codeproject.com/Articles/483055/XML-Serialization-and-Deserialization-Part-1

     
    XML序列化是把强类型的类转化为XML,用于存储和传输。
    特征:
    1)只会序列化public的属性和字段
    2)不包含类型信息
    3)构造函数不能有参数
    4)ReadOnly的属性是不会被序列化的
     
    1. 通用静态类
    在这里我用了一个public的static方法来处理序列化和反序列化:
        public static class ExtXMLSerialization
        {
            public static void SerializeToXml<T>(T obj, string fileName)
            {
                XmlSerializer ser = new XmlSerializer( typeof(T));
                FileStream fileStream = new FileStream(fileName, FileMode.OpenOrCreate);
                ser.Serialize(fileStream, obj);
                fileStream.Close();
            }
     
            public static T DeserializeFromXml<T>(string xml)
            {
                T result;
                XmlSerializer ser = new XmlSerializer( typeof(T));
                using (TextReader tr = new StringReader(xml))
                {
                    result = (T)ser.Deserialize(tr);
                }
                return result;
            }
        }
    之后的函数就调用这个方法来写范例代码了。
     
    2. 基本方法
    首先先要添加引用:
    using System.Xml.Serialization;
    using System.IO;
    然后来看一个最简单的范例:
        class Program
        {
            static void Main(string[] args)
            {
                Class1 a = new Class1();
                a.Property1 = 1;
                a.Property2 = "aaa";
                ExtXMLSerialization.SerializeToXml<Class1 >(a, "C:\1.xml");
     
                Console.Read();
            }
        }
     
        public class Class1
        {
            public int Property1
            {
                get;
                set;
            }
     
            public string Property2
            {
                get;
                set;
            }
        }
    最终会生成这么个xml:
    <?xml version="1.0"?>
    <Class1 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Property1>1</Property1>
      <Property2>aaa</Property2>
    </Class1>
     
    2. List
    对于Generic的List,需要增加一个XmlElement
    我们来增加一个类:
        public class Class1List
        {
            [ XmlElement("Class1" )]
            public List <Class1> MyList
            {
                get;
                set;
            }
     
            public Class1List()
            {
                MyList = new List <Class1>();
            }
        }
    然后序列化这个类:
             static void Main(string[] args)
            {
                Class1 a = new Class1();
                a.Property1 = 1;
                a.Property2 = "aaa";
                Class1 b = new Class1();
                b.Property1 = 2;
                b.Property2 = "bbb";
                Class1List list = new Class1List();
                list.MyList.Add(a);
                list.MyList.Add(b);
                ExtXMLSerialization.SerializeToXml<Class1List >(list, "C:\1.xml");
     
                Console.Read();
            }
    由于Class1List这个类通过Class1这个子类的tag来解析,需要我们用XmlElement关键字来指引。
    结果如下:
    <?xml version="1.0"?>
    <Class1List xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Class1>
        <Property1>1</Property1>
        <Property2>aaa</Property2>
      </Class1>
      <Class1>
        <Property1>2</Property1>
        <Property2>bbb</Property2>
      </Class1>
    </Class1List>
    除了XmlElement之外,还有XmlAttribute(表示Attribute),XmlIgnore(表忽视),XmlRoot(表根节点)
     
    我现在工作项目中用到的基本都是JSON。。。
    不过自己随便写写东西还是会用XML,毕竟可读性好一些。之前自己脑残竟然全部用XDocument手工来读写。。。于是最近重构了。
     
    补充:
    1. static的成员不会被序列化
     
    2. 与Java Serializer之间的互相移植
     
    3. 不能对interface类型
    例如IModel
    不然就会得到错误:
    Cannot serialize member XXXX of type YYY because it is an interface.
     
    4. 如果要对private的对象序列化,用DataContractSerializer
     
    5. 如果要反序列化诸如:
    <Class1>
         <Model>1</Model>
         <Model>2</Model>
    </Class1>
    这样的XML,可以用List<string>
    public class Class1
    {
    [XmlElement("Model")]
    public List<string> Model;
    }
     
    6. 性能
    可以参考这篇
    相比之下,用binary的DataContractSerializer性能最好
     
    掌握了这些差不多就可以开始用了。如果用的时候还发现什么,再补充吧。
  • 相关阅读:
    Bellman-Ford 单源最短路径算法
    Prim 最小生成树算法
    Kruskal 最小生成树算法
    Kosaraju 算法检测有向图的强连通性
    Kosaraju 算法查找强连通分支
    不相交集合森林的启发式策略
    Union-Find 检测无向图有无环路算法
    redis的持久化方式RDB和AOF的区别
    Docker -v 对挂载的目录没有权限 Permission denied
    postgresql如何让主键自增
  • 原文地址:https://www.cnblogs.com/galaxyyao/p/3169829.html
Copyright © 2020-2023  润新知