XML序列化

常见的两种模式,Binary和XML序列化,Binary二进制序列化没有什么限制,但是XML序列化有限制:

    (1)需序列化的字段必须是公共的(public)
    (2)需要序列化的类都必须有一个无参的构造函数
    (3)枚举变量可序列化为字符串,无需用[XmlInclude]
    (4)导出非基本类型对象,都必须用[XmlInclude]事先声明。该规则递归作用到子元素
        如导出ArrayList对象,若其成员是自定义的,需预包含处理:
        using System.Xml.Serialization;
        [XmlInclude(typeof(自定义类))]
    (5)Attribute中的IsNullable参数若等于false,表示若元素为null则不显示该元素。
        也就是说:针对值类型(如结构体)该功能是实效的
        若数组包含了100个空间,填充了10个类对象,则序列化后只显示10个节点
        若数组包含了100个空间,填充了10个结构体对象,则序列化后会显示100个节点
    (6)真正无法XML序列化的情况
        某些类就是无法XML序列化的(即使使用了[XmlInclude])
            IDictionary(如HashTable)
            System.Drawing.Color
            System.Drawing.Font
            SecurityAttribute声明
        父类对象赋予子类对象值的情况
        对象间循环引用
    (7)对于无法XML序列化的对象,可考虑
        使用自定义xml序列化(实现IXmlSerializable接口)
        实现IDictionary的类,可考虑(1)用其它集合类替代;(2)用类封装之,并提供Add和this函数
        某些类型需要先经过转换,然后才能序列化为 XML。如XML序列化System.Drawing.Color,可先用ToArgb()将其转换为整数
        过于复杂的对象用xml序列化不便的话,可考虑用二进制序列化

在很多情况下,二进制序列化对对象的序列化信息更加完整、准确。
原文地址:https://www.cnblogs.com/ysharp/p/2025690.html