如博文无法正常显示,请访问原文地址: https://blog.csdn.net/ChinarCSDN/article/details/83744489
Chinar 坚持将简单的生活方式,带给世人! (拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例) |
助力理解 XML 中一些特性的具体用法 给新手节省宝贵的时间,避免采坑! |
Chinar 教程效果:
.Net Framework提供了对应的System.Xml.Seriazliation.XmlSerializer负责把对象序列化到XML,以及相应的反序列化
其中有一些特性,在生成XML属性前,将这些特性打在变量上,可以很方便的帮我们指明生成XML数据时,这些变量该以何种方式保存起来
例如:以下一个数据类,打上标签[Serializable]
那么系统在生成XML文件时,会对类中的所有变量进行序列化,进而储存
///
/// 数据2 —— 人类
///
[Serializable]//打上这个标签,会对该类进行序列化
public class Person
{
//XML创建时,生成当前类的属性 Name
[XmlAttribute] public string Name;
public Person()
{
}
///
/// 构造函数
///
public Person(string parameter)
{
Name = parameter;
}
}
对于初学者,很难形象的理解,那么我们慢慢来通过生成的XML,对照着了解下,其他这样的特性都有什么效果
我们先大致浏览下具体代码,然后锁定 数据1
这个测试XML的类(Chinar已经尽量精简了)
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>
讲解:
[XmlAttribute]
:在 XML 中设置为当前类的属性
//XML中设置为当前类的属性
[XmlAttribute] public int Level;
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" 两个生成的是属性
[XmlElement]
:在 XML 中生成节点
[XmlElement("Money", IsNullable = false)]
:将以下变量生成到XML中,节点名“Money”,不可为空
[XmlElement("Money", IsNullable = false)]//将以下变量生成到XML中,节点名“Money”,不可为空
public float Qian;
其实如果不是改名需要,这个特性就算不写,变量生成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 文件中可以看到
就是将Qian
替换为了Money
,生成元素节点
666
[XmlIgnore]
:生成 XML 时忽略该变量
//序列化中忽略掉
[XmlIgnore] public string TestIgnore = "忽略";
所以生成后的 XML 文件中不会有该变量对应的节点
[XmlArray("Items"), XmlArrayItem("item")]
:在 XML 中生成父子关联节点
不写这个就是按照原数组名称与数组类型名生成对应节点Persons
与Person
其实就可以当成,给它们起了个别名!
该特性同样适用于List
列表
//可以设置数组结点和子结点的名字,如果不设置则为变量名和类型名字
[XmlArray("Items"), XmlArrayItem("item")]
public Person[] Persons;
<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
[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;
<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
至此:完美结束!
拥有自己的服务器,无需再找攻略! Chinar 提供一站式教程,闭眼式创建! 为新手节省宝贵时间,避免采坑! |
先点击领取 —— 阿里全产品优惠券 (享受最低优惠)
1 —— 云服务器超全购买流程 (新手必备!)
2 —— 阿里ECS云服务器自定义配置 - 购买教程(新手必备!)
3—— Windows 服务器配置、运行、建站一条龙 !
4 —— Linux 服务器配置、运行、建站一条龙 !
本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。违者必究
对于需要复制、转载、链接和传播博客文章或内容的,请及时和本博主进行联系,留言,Email: [email protected]
对于经本博主明确授权和许可使用文章及内容的,使用时请注明文章或内容出处并注明网址