2.反序列化Xml

2.必备知识点-CSharp中XML反序列化


2.1 知识点

知识回顾

序列化就是把类对象转换为可存储和传输的数据。

反序列化就是把存储或收到的数据转换为类对象。

XML序列化关键知识:

  1. usingStreamWriter
  2. XmlSerializerSerialize 序列化方法

判断文件是否存在

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 };
  • 所以最好不要在读取的类的列表成员变量声明时初始化就赋值

总结

  1. 判断文件是否存在使用 File.Exists
  2. 获取文件流使用 StreamReader streamReader = new StreamReader(path)
  3. 根据文件流,通过 XmlSerializerDeserialize 反序列化出对象

注意: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

×

喜欢就点赞,疼爱就打赏