C#XML序列化特性全中文教程

如博文无法正常显示,请访问原文地址: https://blog.csdn.net/ChinarCSDN/article/details/83744489

C#中序列化XML特性用法


本文提供全图文流程,中文翻译。

Chinar 坚持将简单的生活方式,带给世人!

(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例)


Chinar —— 心分享、心创新!

助力理解 XML 中一些特性的具体用法

给新手节省宝贵的时间,避免采坑!

Chinar 教程效果:


文章目录

    • Peculiarity —— XML特性
    • Other Peculiarity —— 其他特性
      • 1-[XmlAttribute] —— 生成XML属性
      • 2- [XmlElement] —— XML节点
      • 3- [XmlIgnore] —— 序列化时,忽略该变量
      • 4- [XmlArray] —— XML数组
      • 5- Array[XmlElement] —— XML数组中的元素依次声明
  • 支持
    • May Be —— 搞开发,总有一天要做的事!


全文高清图片,点击即可放大观看 (很多人竟然不知道)


Peculiarity —— XML特性


.Net Framework提供了对应的System.Xml.Seriazliation.XmlSerializer负责把对象序列化到XML,以及相应的反序列化

其中有一些特性,在生成XML属性前,将这些特性打在变量上,可以很方便的帮我们指明生成XML数据时,这些变量该以何种方式保存起来

例如:以下一个数据类,打上标签[Serializable]那么系统在生成XML文件时,会对类中的所有变量进行序列化,进而储存
New举例子黑白88

/// 
/// 数据2 —— 人类
/// 
[Serializable]//打上这个标签,会对该类进行序列化
public class Person
{
	//XML创建时,生成当前类的属性 Name
    [XmlAttribute] public string Name;

    public Person()
    {
    }

    /// 
    /// 构造函数
    /// 
    public Person(string parameter)
    {
        Name = parameter;
    }
}

Other Peculiarity —— 其他特性


对于初学者,很难形象的理解,那么我们慢慢来通过生成的XML,对照着了解下,其他这样的特性都有什么效果

我们先大致浏览下具体代码,然后锁定 数据1 这个测试XML的类(Chinar已经尽量精简了)
New举例子黑白88

using System;
using System.Collections.Generic;
using System.IO;
using System.Xml.Serialization;
using UnityEngine;


/// 
/// 作用:测试XML特性的用法
/// 作者:Chinar
/// 创建日期:2018-11-05
/// 
public class ChinarXMLPeculiarity : MonoBehaviour
{
    /// 
    /// 初始化函数
    /// 
    void Start()
    {
        ChinarXmlData xml = new ChinarXmlData
        {
            Id         = "这是ID-123456",
            Level      = 88,
            Qian       = 666,
            TestIgnore = "忽略重新赋值",
            Second     = 60
        };
        Person person1 = new Person("人类1");
        Person person2 = new Person("人类2");
        xml.Persons    = new[] {person1, person2};
        xml.PersonList = new List<Person> {person1, person2};
        ChinarBox lb1 = new ChinarBox
        {
            BoxX = 1,
            BoxY = 2,
            BoxZ = 3
        };
        ChinarSphere lb2 = new ChinarSphere
        {
            SphereX = 4,
            SphereY = 5,
            SphereZ = 6
        };
        ChinarTube lb3 = new ChinarTube
        {
            TubeX = 7,
            TubeY = 8,
            TubeZ = 9
        };
        xml.Items = new[] {(object) lb1, lb2, lb3};

        //生成XML
        CreateXml(Application.dataPath + @"\Chinar Demo\Resources\Files\Serializefield.txt", xml, typeof(ChinarXmlData), "root");

        //读取
        var v = LoadXml<ChinarXmlData>(Application.dataPath + @"\Chinar Demo\Resources\Files\Serializefield.txt");
        print(v);
        print(v.PersonList[0]);
        print(v.PersonList[1]);
        print(v.Qian);
    }


    /// 
    /// 创建XML
    /// 
    /// 保存路径
    /// 要储存的对象
    /// 类型
    /// 根节点名称
    public void CreateXml(string savePath, object targetObjcet, Type targetType, string xmlRootName)
    {
        if (!string.IsNullOrEmpty(savePath) && targetObjcet != null)
        {
            targetType = targetType ?? targetObjcet.GetType();
            using (StreamWriter writer = new StreamWriter(savePath))
            {
                System.Xml.Serialization.XmlSerializer xmlSerializer = string.IsNullOrEmpty(xmlRootName) ? new System.Xml.Serialization.XmlSerializer(targetType) : new System.Xml.Serialization.XmlSerializer(targetType, new XmlRootAttribute(xmlRootName));
                xmlSerializer.Serialize(writer, targetObjcet);
            }
        }
    }


    /// 
    /// 加载XML
    /// 
    /// 加载路径
    /// Object
    public TChinar LoadXml<TChinar>(string loadPath)
    {
        object result = null;
        if (!File.Exists(loadPath)) return default(TChinar);
        using (StreamReader reader = new StreamReader(loadPath))
        {
            System.Xml.Serialization.XmlSerializer xmlSerializer = new System.Xml.Serialization.XmlSerializer(typeof(TChinar), new XmlRootAttribute("root"));
            result = xmlSerializer.Deserialize(reader);
        }

        return (TChinar) result;
    }
}


/// 
/// 数据1 —— 测试XML的类
/// 
[SerializeField] //必须设置这个,要不然不能进行序列化
public class ChinarXmlData
{
    public string Id;

    //XML中设置为当前类的属性
    [XmlAttribute] public int Level;

    [XmlElement("Money", IsNullable = false)]
    public float Qian;

    //序列化中忽略掉
    [XmlIgnore] public string TestIgnore = "忽略";

    //get set设置的方式也可以进行序列化,但是私有不会被生成出去
    private int second = 10;
    public int Second
    {
        get { return second; }
        set { second = value; }
    }

    //可以设置数组结点和子结点的名字,如果不设置则为变量名和类型名字
    [XmlArray("Items"), XmlArrayItem("item")]
    public Person[] Persons;

    
    //支持泛型
    public List<Person> PersonList;

    /// 
    /// 依照顺序,指出XML元素内容节点
    /// 
    [XmlElement("Box", typeof(ChinarBox))]
    [XmlElement("Sphere", typeof(ChinarSphere))]
    [XmlElement("Tube", typeof(ChinarTube))]
    //基础管
    public object[] Items;
}


/// 
/// 数据2 —— 人类
/// 
[Serializable]
public class Person
{
    //XML创建时,生成当前类的属性 Name
    [XmlAttribute] public string Name;


    public Person()
    {
    }


    /// 
    /// 构造函数
    /// 
    public Person(string parameter)
    {
        Name = parameter;
    }
}


/// 
/// 数据3 —— 基础盒
/// 
[Serializable]
public class ChinarBox
{
    /// 
    /// 属性
    /// 
    [XmlAttribute] public float BoxX;
    [XmlAttribute] public float BoxY;
    [XmlAttribute] public float BoxZ;
}


/// 
/// 数据4 —— 基础圆
/// 
[Serializable]
public class ChinarSphere
{
    [XmlAttribute] public float SphereX;
    [XmlAttribute] public float SphereY;
    [XmlAttribute] public float SphereZ;
}


/// 
/// 数据5 —— 基础管
/// 
[Serializable]
public class ChinarTube
{
    [XmlAttribute] public float TubeX;
    [XmlAttribute] public float TubeY;
    [XmlAttribute] public float TubeZ;
}

生成的XML文件:


<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Level="88">
  <Id>这是ID-123456Id>
  <Money>666Money>
  <Items>
    <item Name="人类1" />
    <item Name="人类2" />
  Items>
  <PersonList>
    <Person Name="人类1" />
    <Person Name="人类2" />
  PersonList>
  <Box BoxX="1" BoxY="2" BoxZ="3" />
  <Sphere SphereX="4" SphereY="5" SphereZ="6" />
  <Tube TubeX="7" TubeY="8" TubeZ="9" />
  <Second>60Second>
root>

讲解:

1-[XmlAttribute] —— 生成XML属性

[XmlAttribute] :在 XML 中设置为当前类的属性

    //XML中设置为当前类的属性
    [XmlAttribute] public int Level;

New举例子黑白88
XML 文件中可以看到 Name Level ,生成是属性,并非元素节点

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Level="88">

    <Person Name="人类1" />
Level="88"
Name="人类1" 两个生成的是属性

2- [XmlElement] —— XML节点

[XmlElement] :在 XML 中生成节点

[XmlElement("Money", IsNullable = false)]:将以下变量生成到XML中,节点名“Money”,不可为空

	[XmlElement("Money", IsNullable = false)]//将以下变量生成到XML中,节点名“Money”,不可为空
    public float Qian;

New举例子黑白88
其实如果不是改名需要,这个特性就算不写,变量生成XML时也是元素节点

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Level="88">
  <Id>这是ID-123456</Id>
  <Money>666</Money><!-- 这里将Qian替换成了Money,生成的是元素节点 -->

XML 文件中可以看到 666就是将Qian替换为了Money,生成元素节点

666

3- [XmlIgnore] —— 序列化时,忽略该变量

[XmlIgnore] :生成 XML 时忽略该变量

    //序列化中忽略掉
    [XmlIgnore] public string TestIgnore = "忽略";

所以生成后的 XML 文件中不会有该变量对应的节点


4- [XmlArray] —— XML数组

[XmlArray("Items"), XmlArrayItem("item")] :在 XML 中生成父子关联节点

不写这个就是按照原数组名称与数组类型名生成对应节点PersonsPerson

其实就可以当成,给它们起了个别名!

该特性同样适用于List列表

    //可以设置数组结点和子结点的名字,如果不设置则为变量名和类型名字
    [XmlArray("Items"), XmlArrayItem("item")]
    public Person[] Persons;

New举例子黑白88

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Level="88">
  <Id>这是ID-123456</Id>
  <Money>666</Money><!-- 这里将Qian替换成了Money,生成的是元素节点 -->
  <Items><!-- 对应Persons -->
    <item Name="人类1" /><!-- 对应Person -->
    <item Name="人类2" />
  </Items>

XML 文件中可以看到对应关系已经变更
Items——Persons
Item——Person

  
    
    
  

5- Array[XmlElement] —— XML数组中的元素依次声明

[XmlElement("Box", typeof(ChinarBox))] :由于下边变量是数组, XML 中生成数组中元素对应的类,并直接按照类中的变量进行序列化

数组元素和这些特性修饰,是一一对应的

第0个 —— Box
第1个 —— Sphere
第2个 —— Tube

    /// 
    /// 依照顺序,指出XML元素内容节点
    /// 
    [XmlElement("Box", typeof(ChinarBox))]
    [XmlElement("Sphere", typeof(ChinarSphere))]
    [XmlElement("Tube", typeof(ChinarTube))]
    //基础管
    public object[] Items;

New举例子黑白88

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Level="88">
  <Id>这是ID-123456</Id>
  <Money>666</Money>
  <Items>
    <item Name="人类1" />
    <item Name="人类2" />
  </Items>
  <PersonList>
    <Person Name="人类1" />
    <Person Name="人类2" />
  </PersonList>
  <Box BoxX="1" BoxY="2" BoxZ="3" />
  <Sphere SphereX="4" SphereY="5" SphereZ="6" />
  <Tube TubeX="7" TubeY="8" TubeZ="9" />

XML 文件中可以看到对应关系本来数组中所有元素,应该生成的是object
而添加特性后,依照对应关系变成了:

0——Box
1——Sphere
2——Tube

  
  
  

至此:完美结束!


支持

May Be —— 搞开发,总有一天要做的事!


拥有自己的服务器,无需再找攻略!

Chinar 提供一站式教程,闭眼式创建!

为新手节省宝贵时间,避免采坑!

先点击领取 —— 阿里全产品优惠券 (享受最低优惠)



1 —— 云服务器超全购买流程 (新手必备!)


2 —— 阿里ECS云服务器自定义配置 - 购买教程(新手必备!)


3—— Windows 服务器配置、运行、建站一条龙 !


4 —— Linux 服务器配置、运行、建站一条龙 !


Chinar

技术交流群:806091680 ! Chinar 欢迎你的加入


END

本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。违者必究

对于需要复制、转载、链接和传播博客文章或内容的,请及时和本博主进行联系,留言,Email: [email protected]

对于经本博主明确授权和许可使用文章及内容的,使用时请注明文章或内容出处并注明网址

你可能感兴趣的:(c#,xml)