工作中我们经常会用到序列化和反序列化,主要用于进行文件的读取和保存,能够更好的保存我们项目中所进行使用的东西:
在日常生活中我们有许多文件都是通过二进制的方式进行存储,但是二进制的文件的制作需要首先进行序列化:
关于序列化的目的:
1、以某种存储形式使自定义对象持久化;
2、将对象从一个地方传递到另一个地方。
3、使程序更具维护性。
脚本的字段需要满足什么条件才能被序列化?(必须同时满足)
1. public 类型,或者有 [SerializeField]
2. 不是 static
3. 不是 const
4. 不是 readonly
5. 类型必须是 Unity 可以序列化的类型
Unity 可以序列化哪类型?
1. 自定义的,非 abstract 的类,且有 [Serializable]
2. 有 [Serializable] 的结构体
3. UnityEngine.Object 的子类的引用
4. 原生类型(int,float,double,bool,string, etc)
5. 以上类型的数组
6. 以上类型的 List<T>
下面是进行文件的序列化和反序列化的代码
/// <summary>
/// 关于进行文件的序列化
/// </summary>
public static byte[] SerializeToByteArray(this object obj)
{
if (obj == null)
{
return null;
}
var bf = new BinaryFormatter();
using (var ms = new MemoryStream())
{
bf.Serialize(ms, obj);
return ms.ToArray();
}
}
/// <summary>
/// 进行文件的反序列化
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="byteArray"></param>
/// <returns></returns>
public static T Deserialize<T>(this byte[] byteArray) where T : class
{
if (byteArray == null)
{
return null;
}
using (var memStream = new MemoryStream())
{
var binForm = new BinaryFormatter();
memStream.Write(byteArray, 0, byteArray.Length);
memStream.Seek(0, SeekOrigin.Begin);
var obj = (T)binForm.Deserialize(memStream);
return obj;
}
}
我们可以通过上面的方法,就能够实现快速的进行序列化的文件的保存,这样就能够更加准确的保存数据和读取数据!!!!!!!
