1.必备知识点-CSharp中XML序列化
1.1 知识点
什么是序列化和反序列化
序列化:把对象转化为可传输的字节序列过程称为序列化。
反序列化:把字节序列还原为对象的过程称为反序列化。
说人话:
序列化就是把想要存储的内容转换为字节序列用于存储或传递。
反序列化就是把存储或收到的字节序列信息解析读取出来使用。
XML序列化
创建测试用于存储的两个类
public class Lesson1Test
{
public int testPublic = 1;
[XmlElement("testPublic2222222222")]
public int testPublic2 = 2;
private int testPrivate = 3;
protected int testProtected = 4;
internal int testInternal = 5;
public string testPublicStr = "我是testPublicStr";
public int testPro { get; set; }
public Lesson1Test2 testClass = new Lesson1Test2();
public int[] arrayInt = new int[3] { 1, 2, 3 };
[XmlArray("IntList")]
[XmlArrayItem("Int32")]
public List<int> listInt = new List<int> { 1, 2, 3, 4 };
public List<int> listInt2 = new List<int> { 5, 6, 7, 8 };
public List<Lesson1Test2> listItem = new List<Lesson1Test2> { new Lesson1Test2(),new Lesson1Test2()};
//不支持字典
//public Dictionary<int, string> testDic = new Dictionary<int, string>() { { 1, "123" } };
}
public class Lesson1Test2
{
[XmlAttribute("Test1")]
public int test1 = 1;
[XmlAttribute()]
public float test2 = 1.1f;
[XmlAttribute()]
public bool test3 = true;
}
使用XML序列化的函数存储XML
关键类和语法
XmlSerializer Xml序列化器类:用于序列化对象为XML的关键类
StreamWriter 流写入器类:用于存储文件
using:用于方便流对象释放和销毁
准备一个数据结构类对象
Lesson1Test lesson1Test = new Lesson1Test();
XmlSerializer.Serialize 配合流实例化对应类的序列化器进行序列化
//第一步:确定存储路径
string path = Application.persistentDataPath + "/Lesson1Test.xml";
print(Application.persistentDataPath);
//第二步:结合 using知识点 和 StreamWriter这个流对象 来写入文件
// 括号内的StreamWriter相关代码的作用:写入一个文件流 传入路径 如果路径上有该文件 直接打开并修改 如果路径上没有该文件 直接新建一个文件
// using的新用法:括号当中包裹的声明的对象 会在 大括号语句块结束后 自动释放掉
// 当大括号语句块结束 会自动帮助我们调用 对象的 Dispose这个方法 让其进行销毁
// using一般都是配合 内存占用比较大 或者 有读写操作时 进行使用的
using (StreamWriter streamWriter = new StreamWriter(path))
{
//第三步:进行xml文件序列化
//创建XmlSerializer类 传入要存储的类的反射类
//可以XmlSerializer理解为一个翻译成xml的翻译机器
XmlSerializer xmlSerializer = new XmlSerializer(typeof(Lesson1Test));
//XmlSerializer类中的Serialize方法 序列化对象转成xml传入六文件中
//这句代码的含义 就是通过序列化对象 对我们类对象进行翻译 将其翻译成我们的xml文件 写入到对应的文件中
//第一个参数 : 文件流对象
//第二个参数: 想要备翻译 的对象
//注意 :翻译机器的类型 一定要和传入的对象是一致的 不然会报错
xmlSerializer.Serialize(streamWriter, lesson1Test);
//只要是公共的的成员 都能存储 不支持字典
}
查看存储的XML文件
- private protected internal 的变量都不能序列化 public的变量才能存储
- 不支持字典 会报错
<?xml version="1.0" encoding="utf-8"?>
<Lesson1Test xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<testPublic>1</testPublic>
<testPublic2222222222>2</testPublic2222222222>
<testPublicStr>我是testPublicStr</testPublicStr>
<testClass Test1="1" test2="1.1" test3="true" />
<arrayInt>
<int>1</int>
<int>2</int>
<int>3</int>
</arrayInt>
<IntList>
<Int32>1</Int32>
<Int32>2</Int32>
<Int32>3</Int32>
<Int32>4</Int32>
</IntList>
<listInt2>
<int>5</int>
<int>6</int>
<int>7</int>
<int>8</int>
</listInt2>
<listItem>
<Lesson1Test2 Test1="1" test2="1.1" test3="true" />
<Lesson1Test2 Test1="1" test2="1.1" test3="true" />
</listItem>
<testPro>0</testPro>
</Lesson1Test>
自定义节点名或设置属性
可以通过特性设置节点或设置属性,并且修改名字。
[XmlAttribute()]
:这个字段要变成XML的属性[XmlAttribute("Test1")]
:这个字段要变成XML的属性,并且属性名是Test1[XmlElement("testPublic123123")]
:这个字段要变成XML的元素节点,并且节点名是testPublic123123[XmlArray("IntList")]
:改变数组对象存储XML的节点名为IntList[XmlArrayItem("Int32")]
:改变数组元素对象存储XML的节点名,每个元素的节点名都变成Int32
总结
序列化流程:
- 有一个想要保存的类对象
- 使用
XmlSerializer
序列化该对象 - 通过
StreamWriter
配合using
将数据存储写入文件
注意:
- 只能序列化公共成员
- 不支持字典序列化
- 可以通过特性修改节点信息或者设置属性信息
- Stream相关要配合
using
使用
1.2 知识点代码
Lesson01_必备知识点_CSharp中XML序列化
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Xml.Serialization;
using UnityEngine;
public class Lesson1Test
{
public int testPublic = 1;
[XmlElement("testPublic2222222222")]
public int testPublic2 = 2;
private int testPrivate = 3;
protected int testProtected = 4;
internal int testInternal = 5;
public string testPublicStr = "我是testPublicStr";
public int testPro { get; set; }
public Lesson1Test2 testClass = new Lesson1Test2();
public int[] arrayInt = new int[3] { 1, 2, 3 };
[XmlArray("IntList")]
[XmlArrayItem("Int32")]
public List<int> listInt = new List<int> { 1, 2, 3, 4 };
public List<int> listInt2 = new List<int> { 5, 6, 7, 8 };
public List<Lesson1Test2> listItem = new List<Lesson1Test2> { new Lesson1Test2(),new Lesson1Test2()};
//不支持字典
//public Dictionary<int, string> testDic = new Dictionary<int, string>() { { 1, "123" } };
}
public class Lesson1Test2
{
[XmlAttribute("Test1")]
public int test1 = 1;
[XmlAttribute()]
public float test2 = 1.1f;
[XmlAttribute()]
public bool test3 = true;
}
public class Lesson01_必备知识点_CSharp中XML序列化 : MonoBehaviour
{
void Start()
{
#region 知识点一 什么是序列化和反序列化
//序列化:把对象转化为可传输的字节序列过程称为序列化
//反序列化:把字节序列还原为对象的过程称为反序列化
//说人话:
//序列化就是把想要存储的内容转换为字节序列用于存储或传递
//反序列化就是把存储或收到的字节序列信息解析读取出来使用
#endregion
#region 知识点二 xml序列化
//1.第一步准备一个数据结构类
Lesson1Test lesson1Test = new Lesson1Test();
//2.进行序列化
// 关键知识点
// XmlSerializer 用于序列化对象为xml的关键类
// StreamWriter 用于存储文件
// using 用于方便流对象释放和销毁
//第一步:确定存储路径
string path = Application.persistentDataPath + "/Lesson1Test.xml";
print(Application.persistentDataPath);
//第二步:结合 using知识点 和 StreamWriter这个流对象 来写入文件
// 括号内的StreamWriter相关代码的作用:写入一个文件流 传入路径 如果路径上有该文件 直接打开并修改 如果路径上没有该文件 直接新建一个文件
// using的新用法:括号当中包裹的声明的对象 会在 大括号语句块结束后 自动释放掉
// 当大括号语句块结束 会自动帮助我们调用 对象的 Dispose这个方法 让其进行销毁
// using一般都是配合 内存占用比较大 或者 有读写操作时 进行使用的
using (StreamWriter streamWriter = new StreamWriter(path))
{
//第三步:进行xml文件序列化
//创建XmlSerializer类 传入要存储的类的反射类
//可以XmlSerializer理解为一个翻译成xml的翻译机器
XmlSerializer xmlSerializer = new XmlSerializer(typeof(Lesson1Test));
//XmlSerializer类中的Serialize方法 序列化对象转成xml传入六文件中
//这句代码的含义 就是通过序列化对象 对我们类对象进行翻译 将其翻译成我们的xml文件 写入到对应的文件中
//第一个参数 : 文件流对象
//第二个参数: 想要备翻译 的对象
//注意 :翻译机器的类型 一定要和传入的对象是一致的 不然会报错
xmlSerializer.Serialize(streamWriter, lesson1Test);
//只要是公共的的成员 都能存储 不支持字典
}
#endregion
#region 知识点三 自定义节点名 或 设置属性
//可以通过特性 设置节点或者设置属性 并且修改名字
//[XmlAttribute()] 这个字段要变成xml的属性
//[XmlAttribute("Test1")] 这个字段要变成xml的属性 并且属性名是Test1
//[XmlElement("testPublic123123")] 这个字段要变成xml的元素节点 并且节点名是testPublic123123
//[XmlArray("IntList")] 改变数组对象存储xml的节点名为IntList
//[XmlArrayItem("Int32")] 改变数组元素对象存储xml的节点名 每个元素的节点名都变成Int32
#endregion
#region 总结
//序列化流程
//1.有一个想要保存的类对象
//2.使用XmlSerializer 序列化该对象
//3.通过StreamWriter 配合 using将数据存储 写入文件
//注意:
//1.只能序列化公共成员
//2.不支持字典序列化
//3.可以通过特性修改节点信息 或者设置属性信息
//4.Stream相关要配合using使用
#endregion
}
}
Lesson1Test.xml
<?xml version="1.0" encoding="utf-8"?>
<Lesson1Test xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<testPublic>1</testPublic>
<testPublic2222222222>2</testPublic2222222222>
<testPublicStr>我是testPublicStr</testPublicStr>
<testClass Test1="1" test2="1.1" test3="true" />
<arrayInt>
<int>1</int>
<int>2</int>
<int>3</int>
</arrayInt>
<IntList>
<Int32>1</Int32>
<Int32>2</Int32>
<Int32>3</Int32>
<Int32>4</Int32>
</IntList>
<listInt2>
<int>5</int>
<int>6</int>
<int>7</int>
<int>8</int>
</listInt2>
<listItem>
<Lesson1Test2 Test1="1" test2="1.1" test3="true" />
<Lesson1Test2 Test1="1" test2="1.1" test3="true" />
</listItem>
<testPro>0</testPro>
</Lesson1Test>
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com