序列化定义
- 序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
如何标记一个类实例化出来的对象可以被序列化呢?
- 首先需要引入命名空间System.Xml.Serialization
- 需要序列化的类加入System.Serializable标签
- 属性加上对应序列化标签。
using System.Xml.Serialization;
using System.Collections.Generic;
[System.Serializable]
public class TestSerilize
{
[XmlAttribute("ID")]
public int ID { get; set; }
[XmlAttribute("Name")]
public string Name { get; set; }
[XmlElement("Lst")]
public List<int> Lst { get; set; }
}```
### XML序列化与反序列化
```csharp
#region XML序列化与反序列化
void XmlSerilize(TestSerilizeData serilize)
{
FileStream fileStream = new FileStream(Application.dataPath+"/test.txt", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
StreamWriter writer = new StreamWriter(fileStream, System.Text.Encoding.UTF8);
XmlSerializer xmlSerializer = new XmlSerializer(serilize.GetType());
xmlSerializer.Serialize(writer, serilize);
writer.Close();
fileStream.Close();
}
TestSerilizeData XmlDeSerilize()
{
FileStream fileStream=new FileStream(Application.dataPath + "/test.txt", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
XmlSerializer xmlSerializer = new XmlSerializer(typeof(TestSerilizeData));
return xmlSerializer.Deserialize(fileStream) as TestSerilizeData;
}
#endregion
二进制方式序列化与反序列化
- 引入命名空间using System.Runtime.Serialization.Formatters.Binary;
- 使用BinaryFormatter 这个类进行序列化与反序列化
#region 转换为二进制文件并保存
void BinarySeriliza(SerilizeData data)
{
FileStream fileStream = new FileStream(Application.dataPath + "/Test01.bytes", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(fileStream, data);
fileStream.Close();
}
SerilizeData BinaryDeserilize()
{
TextAsset textAsset = AssetDatabase.LoadAssetAtPath<TextAsset>("Assets/Test01.bytes");
MemoryStream stram = new MemoryStream(textAsset.bytes);
BinaryFormatter bf = new BinaryFormatter();
SerilizeData data = (SerilizeData)bf.Deserialize(stram);
return data;
}
#endregion
Unity自带 Assets序列化
[CreateAssetMenu(fileName = "TextAssets", menuName = "Creat", order = 5000)]
public class AssetsSrilz : ScriptableObject
{
public int ID;
public string Name;
public List<int> Lst;
}
#region assets 序列化 与读取
private void ReadAssets()
{
AssetsSrilz asset =UnityEditor.AssetDatabase.LoadAssetAtPath<AssetsSrilz>("Assets/TextAssets.asset");
Debug.Log(asset.Name);
}
#endregion