2.必备知识点-CSharp中XML反序列化
2.1 知识点
知识回顾
序列化就是把类对象转换为可存储和传输的数据。
反序列化就是把存储或收到的数据转换为类对象。
XML序列化关键知识:
using
和StreamWriter
XmlSerializer
的Serialize
序列化方法
判断文件是否存在
string path = Application.persistentDataPath + "/Lesson1Test.xml";
// 存在再进行反序列化的处理,不存在就不能反序列化
if (File.Exists(path))
{
// 反序列化处理
}
XmlSerializer.Deserialize 配合流实例化对应类的序列化器进行反序列化
如果路径指向的文件存在,则进行反序列化处理。
// 使用 StreamReader 读取文件对象初始化,传入路径
using (StreamReader streamReader = new StreamReader(path))
{
// 创建 XmlSerializer 类,传入要反序列化的类的反射类
XmlSerializer xmlSerializer = new XmlSerializer(typeof(Lesson1Test));
// XmlSerializer 类中的 Deserialize 反序列化方法,反序列化对应 streamReader 读取到的内容,返回值是万物之父
Lesson1Test lesson1Test = xmlSerializer.Deserialize(streamReader) as Lesson1Test;
// 注意:如果要读取的类的列表成员变量声明时初始化就赋值了,反序列化出来会有两倍数组
// 比如:public List<int> listInt = new List<int> { 1, 2, 3 }; 反序列化出来的 listInt 会有 { 1, 2, 3,1, 2, 3 };
// 所以最好不要在读取的类的列表成员变量声明时初始化就赋值
}
- 注意:如果要读取的类的列表成员变量声明时初始化就赋值了,反序列化出来会有两倍数组
- 比如:
public List<int> listInt = new List<int> { 1, 2, 3 };
反序列化出来的listInt
会有 { 1, 2, 3,1, 2, 3 }; - 所以最好不要在读取的类的列表成员变量声明时初始化就赋值
总结
- 判断文件是否存在使用
File.Exists
- 获取文件流使用
StreamReader streamReader = new StreamReader(path)
- 根据文件流,通过
XmlSerializer
的Deserialize
反序列化出对象
注意:List 对象如果有默认值,在反序列化时不会清空,会往后面添加。
2.2 知识点代码
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Xml.Serialization;
using UnityEngine;
public class Lesson02_必备知识点_CSharp中XML反序列化 : MonoBehaviour
{
void Start()
{
#region 知识回顾
// 序列化 就是把类对象 转换为可存储和传输的数据
// 反序列化 就是把存储或收到的数据 转换为 类对象
// xml序列化关键知识
// 1.using 和 StreamWriter
// 2.XmlSerializer 的 Serialize序列化方法
#endregion
#region 知识点一 判断文件是否存在
string path = Application.persistentDataPath + "/Lesson1Test.xml";
//存在再进行反序列化的处理 不存在就不能反序列化
if (File.Exists(path))
{
#region 知识点二 反序列化
//如果路径是存在要反序列化的文件
//关键知识
// 1.using 和 StreamReader
// 2.XmlSerializer 的 Deserialize反序列化方法
//using 读取文件对象StreamReader 初始化传入路径
using (StreamReader streamReader = new StreamReader(path))
{
//传入一个类的反射类 产生了一个 序列化反序列化的翻译机器
XmlSerializer xmlSerializer = new XmlSerializer(typeof(Lesson1Test));
//XmlSerializer类中的Deserialize反序列化方法 反序列化对应streamReader读取到的内容 返回值是万物之父
Lesson1Test lesson1Test = xmlSerializer.Deserialize(streamReader) as Lesson1Test;
//注意:这里的小坑 假如要读取的类的列表成员变量声明时初始化就赋值了 反序列化出来会有两倍数组
//比如:public List<int> listInt = new List<int> { 1, 2, 3 }; 反序列化出来的listInt会有 { 1, 2, 3,1, 2, 3 };
//所以最好不要在读取的类的列表成员变量声明时初始化就赋值
}
#endregion
}
#endregion
#region 总结
//1.判断文件是否存在 File.Exists
//2.文件流获取 StreamReader streamReader = new StreamReader(path)
//3.根据文件流 XmlSerializer通过Deserialize反序列化 出对象
//注意:List对象 如果有默认值 反序列化时 不会清空 会往后面添加
#endregion
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com