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; }
浙公网安备 33010602011771号