Unity 底层框架篇 (三)C#的 xml 序列化 与 类与二进制的相互转换

C# xml序列化是把一个类  序列化成一个本地数据文件

类和二进制转换 是将类对象生成 .bytes文件  再将.bytes文件反序列化成对象

这个在   策划配表  以及  游戏数据本地化 如存档  都很有意义

1、先写一个需要序列化的类

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

// 添加这个标签 说明这个类是可以被序列化的
[System.Serializable]
public class MySerializeTest 
{
    [XmlAttribute("Id")]
    public int Id { get; set; }
    [XmlAttribute("Name")]
    public string Name { get; set; }

    // List 用 XmlArray 或者 XmlElement
    [XmlElement("List")]
    public List<int> List { get; set; }
}

2、实例化一个需要被序列化的类对象

    void SerializeTest()
    {
        MySerializeTest mySerializeTest = new MySerializeTest();
        mySerializeTest.Id = 1002;
        mySerializeTest.Name = "cfx";
        mySerializeTest.List = new List<int>();
        mySerializeTest.List.Add(2);
        mySerializeTest.List.Add(3);

        // 通过IO 及 序列化相关的类 将内存里的对象序列化成硬盘中的文件
        XmlSerialize(mySerializeTest);
    }

3、IO操作

    void XmlSerialize(MySerializeTest mySerialize)
    {
        // Application.dataPath 这个目录是Assets的根目录
        // 新建一个文件流对象 文件路径名, 文件模式 , 文件访问权限,文件分享权限
        FileStream fileStream = new FileStream(Application.dataPath + "/test.xml", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);

        // 根据文件流 打开一个写入流  流,编码格式
        StreamWriter sw = new StreamWriter(fileStream, System.Text.Encoding.UTF8);

        // Xml序列化器的对象  类的类型
        XmlSerializer xml = new XmlSerializer(mySerialize.GetType());

        // Serialize 执行序列化
        xml.Serialize(sw, mySerialize);

        // 关闭流的闸
        sw.Close();

        // 关闭文件的闸
        fileStream.Close();
        AssetDatabase.Refresh();
    }

 XML的反向序列化  (将硬盘中的文件读到内存里)

1、使用文件流对象FileStream 以读模式打开 上面序列化好的文件test.xml

2、使用XmlSerializer 序列化器实例化出对象 去反序列化出硬盘中的内容

如代码所展示:

    void DeserializeTest()
    {
        // 打印出对象
        MySerializeTest mySerializeTest = XmlDeserialize();
        Debug.Log(mySerializeTest.Id);
        Debug.Log(mySerializeTest.Name);
        foreach (int item in mySerializeTest.List)
        {
            Debug.Log(item);
        }
    }

    MySerializeTest XmlDeserialize()
    {
        // 使用文件流对象操作文件
        FileStream fs = new FileStream(Application.dataPath + "/test.xml", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);

        // 使用序列化器对象 反序列化文件流
        XmlSerializer xs = new XmlSerializer(typeof(MySerializeTest));
        MySerializeTest mySerializeTest = (MySerializeTest) xs.Deserialize(fs);

        // 关闭文件流
        fs.Close();

        // 返回对象
        return mySerializeTest;
    }

 3、如果只是做 序列化和反序列化的操作并没什么卵用  序列化的一个使用场景是:写一个类定义xml的结构,内容由策划去填充,再反序列化出来用 后续可以通过xml
转成Excel的方式 让策划填写表格

 

4、 将类对象转成二进制文件

    void BinarySerializeTest()
    {
        MySerializeTest mySerializeTest = new MySerializeTest();
        mySerializeTest.Id = 1002;
        mySerializeTest.Name = "二进制测试";
        mySerializeTest.List = new List<int>();
        mySerializeTest.List.Add(2);
        mySerializeTest.List.Add(3);
        BinarySerialize(mySerializeTest);
    }

    void BinarySerialize(MySerializeTest mySerializeTest)
    {
        FileStream fs = new FileStream(Application.dataPath + "/test.bytes", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
        BinaryFormatter bf = new BinaryFormatter();
        bf.Serialize(fs, mySerializeTest);
        fs.Close();
        AssetDatabase.Refresh();
    }

5、将二进制文件转换回类对象

    void DeserializeBinaryTest()
    {
        // 打印出对象
        MySerializeTest mySerializeTest = BinaryDeserialize();
        Debug.Log(mySerializeTest.Id);
        Debug.Log(mySerializeTest.Name);
        foreach (int item in mySerializeTest.List)
        {
            Debug.Log(item);
        }
    }

    MySerializeTest BinaryDeserialize()
    {
        // 文本资源             // 资源数据库在路径中加载资源 需要全路径
        TextAsset textAsset = AssetDatabase.LoadAssetAtPath<TextAsset>("Assets/test.bytes");

        // 内存流  传入bytes
        MemoryStream stream = new MemoryStream(textAsset.bytes);

        // 二进制格式化器
        BinaryFormatter bf = new BinaryFormatter();

        // 反序列化出对象
        MySerializeTest mySerializeTest = (MySerializeTest)bf.Deserialize(stream);
        stream.Close();
        return mySerializeTest;
    }

 

posted @ 2021-04-25 21:39  一个新星的诞生  阅读(95)  评论(0)    收藏  举报