Unity中的序列化

    技术2024-05-24  79

    Unity中的序列化

    XML序列化Assets序列化

    XML序列化

    先创建一个可以序列化的类

    [System.Serializable] public class TestSerialize { [XmlAttribute("Id")] public int Id { get; set; } [XmlAttribute("Name")] public string Name { get; set; } [XmlElement("List")] public List<int> List { get; set; } }

    类转换成XML

    void XmlSerialize(TestSerialize testSerialize) { FileStream fs = new FileStream(Application.dataPath+"/test.xml",FileMode.Create,FileAccess.ReadWrite,FileShare.ReadWrite); XmlSerializer xml = new XmlSerializer(typeof(TestSerialize)); StreamWriter sw = new StreamWriter(fs, new System.Text.UTF8Encoding(false)); //这里的false用来去除UTF-8编码格式文件的BOM头 xml.Serialize(sw, testSerialize); sw.Close(); fs.Close(); }

    XML转换成类

    TestSerialize XmlDeserialize() { FileStream fs = new FileStream(Application.dataPath + "/test.xml", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite); XmlSerializer xml = new XmlSerializer(typeof(TestSerialize)); TestSerialize serilizaTest = (TestSerialize)xml.Deserialize(fs); fs.Close(); return serilizaTest; }

    XML转换成二进制

    void BinarySerialize(TestSerialize testSerialize) { FileStream fs = new FileStream(Application.dataPath + "/test.xml", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite); BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(fs, testSerialize); fs.Close(); }

    二进制转换成类

    TestSerialize BinaryDeserialize() { TextAsset textAsset = UnityEditor.AssetDatabase.LoadAssetAtPath<TextAsset>("Assets/test.bytes"); Debug.Log(Application.dataPath + "/test.bytes"); MemoryStream stream = new MemoryStream(textAsset.bytes); BinaryFormatter bf = new BinaryFormatter(); TestSerialize testSerialize = (TestSerialize)bf.Deserialize(stream); stream.Close(); return testSerialize; }

    Assets序列化

    创建一个类,继承自ScriptableObject

    [CreateAssetMenu(fileName ="TestAssets",menuName ="CreateAssets",order =0)] public class AssetsSerialize : ScriptableObject { public int Id; public string Name; public List<int> TestList; }

    之后可以在Unity中创建asset文件 可以在Inspector面板上更改属性 asset文件的读取

    void ReadTestAssets() { AssetsSerialize assets = UnityEditor.AssetDatabase.LoadAssetAtPath<AssetsSerialize>("Assets/TestAssets.asset"); Debug.Log(assets.Id); Debug.Log(assets.Name); foreach (var i in assets.TestList) { Debug.Log(i); } }
    Processed: 0.020, SQL: 9