C# Xml序列化与反序列化

摘要:
˃根节点名称:根节点名称”MyClassName它是类名。在反序列化期间,根节点名称必须与类名一致。根节点名称可以通过XmlRootAttribute自定义。反序列化时,根节点名必须与自定义的节点名称一致。反序列化后,将首先调用无参数构造函数来构造对象,然后取消序列化属性值尺寸化。若要使用基类属性保存派生类对象,需要将[XmlInclude]添加到基类。序列化的XML文本将包含更多xsi:type=“ExtendeClass”。

Xml文本的序列化与反序列化:

    public static class XmlSerializeHelper
    {
        // 序列化:对象 -> Xml文本
        public static string SerializeToXmlString(object obj)
        {
            StringBuilder buffer = new StringBuilder();
            using (TextWriter writer = new StringWriter(buffer))
            {
                XmlSerializer xmlSrlzer = new XmlSerializer(obj.GetType());
                xmlSrlzer.Serialize(writer, obj);
            }
            return buffer.ToString();
        }

        // 反序列化:Xml文本 -> 对象
        public static TClass DeserializeFromXmlString<TClass>(string xml)
        {
            TClass obj;
            using (StringReader reader = new StringReader(xml))
            {
                XmlSerializer xmlSrlzer = new XmlSerializer(typeof(TClass));
                obj = (TClass)xmlSrlzer.Deserialize(reader);
            }
            return obj;
        }

        // 序列化:对象 -> Xml文件
        public static void SerializeToXmlFile(object obj, string file)
        {
            using(TextWriter writer = new StreamWriter(file))
            {
                XmlSerializer serializer = new XmlSerializer(obj.GetType());
                serializer.Serialize(writer, obj);
            }
        }

        // 反序列化:Xml文本 -> 对象
        public static TClass DeserializeFromXmlFile<TClass>(string file)
        {
            TClass obj;
            using (FileStream reader = new FileStream(file, FileMode.Open))
            {
                XmlSerializer xmlSrlzer = new XmlSerializer(typeof(TClass));
                obj = (TClass)xmlSrlzer.Deserialize(reader);
            }
            return obj;
        }
    }

空对象序列化后的文本:

<?xml version="1.0" encoding="utf-16"?>
<MyClassName xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />

根节点名:

  根节点名“MyClassName”就是类名,反序列化时,根节点名必须与类名一致。

  可以通过XmlRootAttribute自定义根节点名,反序列化时,根节点名必须与自定义的跟节点名一致。

无参构造函数:

  序列化时,不会调用无参构造函数,但如果没有无参构造函数,序列化报异常。

  反序列化时,会首先调用无参构造函数构造对象,然后反序列化属性值。

  无参构造函数设成private无影响。

字段与属性:

  public的字段与属性都会被序列化,private的字段和属性不会被序列化。

  基本类型:<Field>value</Field>                        Field:字段或属性名,Value是ToString()的返回值。

  List<string>:<StringList><string>s1</string><string>s2</string></StringList>     StringList:字段或属性名

  List<int>:<IntList><int>1</int><int>2</int></IntList>               IntList:字段或属性名

  嵌套对象:<SubObj><addr>1</addr><value>2</value></SubObj>

对象List:

  <SubObjList>
    <SubClass>
      <addr>1</addr>
      <value>1</value>
    </SubClass>
    <SubClass>
      <addr>2</addr>
      <value>2</value>
    </SubClass>
  </SubObjList>

泛型对象List:

  <GenericList>
    <GenericClassOfInt32String>      <!-- GenericClass<T1, T2> -->
      <val1>1</val1>
      <val2>b</val2>
    </GenericClassOfInt32String>
    <GenericClassOfInt32String>
      <val1>2</val1>
      <val2>d</val2>
    </GenericClassOfInt32String>
  </GenericList>

   Array和List的序列化文本是一样的。

   反序列化时,XML中没有的字段保留初始化值,XML中多出的字段直接忽略,不会报异常。

类继承:

   类型与对象相同:对XML序列化无影响,能访问的属性或字段就能序列化与反序列化。

  使用基类属性保存派生类对象,需要在基类上添加[XmlInclude(typeof(ExtendClass))],序列化后的XML文本中会多出 xsi:type="ExtendClass"。

  接口不能序列化。

    [XmlInclude(typeof(ExtendClass1))]
    [XmlInclude(typeof(ExtendClass2))]
    public class BaseClass
    {
        public int BP { get; set; }
    }
    public class ExtendClass1 : BaseClass
    {
        public int EP1 { get; set; }
    }
    public class ExtendClass2 : BaseClass
    {
        public int EP2 { get; set; }
    }
    public class MyClassName
    {
        public List<BaseClass> ObjList{ get; set; }
    }
<?xml version="1.0" encoding="utf-8"?>
<MyClassName xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <ObjList>
    <BaseClass xsi:type="ExtendClass1">
      <BP>1</BP>
      <EP1>11</EP1>
    </BaseClass>
    <BaseClass xsi:type="ExtendClass2">
      <BP>2</BP>
      <EP2>22</EP2>
    </BaseClass>
  </ObjList>
</MyClassName>

Dictionary:

  不能序列化,可以使用SerializableDictionary(网上有现成的)。

[DefaultValue(true)]:

  属性上加了该Attribute之后,如果值与DefaultValue相同,XML中不会生成节点,反序列化时却不会设置成DefaultValue,需要在构造函数里通过反射来设置DefaultValue。

去除xmlns:xsd:

                StringBuilder buffer = new StringBuilder();
                using (TextWriter writer = new StringWriter(buffer))
                {
                    XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
                    ns.Add("", "");
                    XmlSerializer xmlSrlzer = new XmlSerializer(obj.GetType());
                    xmlSrlzer.Serialize(writer, obj, ns);
                }

[XmlAttribute]实现XML属性:

    public class SubClass
    {
        [XmlAttribute]
        public int ID { get; set; }

        public string Name { get; set; }
   }
    public class MyClassName
    {
        [XmlAttribute]
        public int Type { get; set; }

        public int Num { get; set; }

        public SubClass Sub { get; set; }
    }
<?xml version="1.0" encoding="utf-16"?>
<MyClassName Type="0">
  <Num>100</Num>
  <Sub ID="1">
    <Name>HAHA</Name>
  </Sub>
</MyClassName>

免责声明:文章转载自《C# Xml序列化与反序列化》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇php日期时间函数 整理IE和Firefox的兼容问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

六、Django的orm之单表操作

Django模型层(一)单表操作 一、ORM ORM是“对象-关系-映射”的简称。(Object Relational Mapping,简称ORM) orm其实就是将类对象的语法翻译成sql语句的一个引擎 类对象 --- sql 类 -- 表 对象 -- 行 属性 -- 字段 原生sql和Python的orm代码对比: 二、Django连接数据库 在Dj...

接口测试——流量录制回放

接口自动化回归技术是我们经常谈到的一种质量保证手段,如今在测试行业针对它的应用已经比较广泛。对于一个轻量级的系统,当我们想针对它完成一个接口自动化回归工具的时候,我们通常都是通过手动梳理的方法将目前系统应用的对外接口列出来然后,然后查阅接口文档,录入测试用例,最终完成断言,看似是一个完美的解决方案。 但是如果面对磅礴复杂的系统,我们还是采用这样的手段,怕是...

1,怎么获得数据库表结构。

1,在注入时初始化这两个模板。 /*** 注入数据源, 该数据源在Spring配置文件中配置* 在注入时初始化这两个模板* @paramdataSource* Method create author: yanwei* Method create dateTime: 2011-11-2 下午03:43:13* Method update autho...

Java-文件加密传输(摘要+签名)

Java-文件加密传输(摘要+签名) 文件加密传输其实就是将文件以二进制格式进行传输。其中加密文件主要由:源文件二进制文件、源文件数字摘要、数字签名、特征码等等组成。摘要可确认文件的唯一性,数字签名则是对摘要进行了加密。 本文主要记录使用RSA加密方式其中生成RSA密钥主要介绍二种方式: 1、安装openssl情况下使用Linux命令生成 2、Java代...

Java路径问题解决方案收集

Java路径中的空格问题 1, TestURL().class.getResource("").getPath()或TestURL().class.getResource("").getFile()获得的路径,不能被FileReader()和FileWriter()直接应用。   原因是URL对空格,特殊字符(%,#,[]等)和中文进行了编码处理。   例...

SortedList、SortedSet、HashSet、Hashtable、Dictionary、SortedDictionary 排序/可重复排序/过滤重复排序等简单对比

//泛型的键值集合/有序/Hash算法/占内存较大/不排序,不受装填因子的限制,对读写操作效率较高 Dictionary<int, string> dc = new Dictionary<int, string>(); dc.Add(1, "111111");...