本文将介绍使用.NET自带的序列化工具、Newtonsoft.json和ProtoBuf-Net来序列化一个成文件,对比文件大小。
初始化数据与数据模型
ProtoContract是ProtoBuf-Net需要序列化元素的特性,Serializable则是自带的Json等需要的特性,同时注意需要申明属性为public。
using ProtoBuf;
using System;
namespace BinarySerialize
{
[Serializable, ProtoContract]
public class SerializeData
{
[ProtoMember(1)]
public int TmplateType;
[ProtoMember(2)]
public int TeplateID;
[ProtoMember(3)]
public string Name;
[ProtoMember(4)]
public int Group;
[ProtoMember(5)]
public float Duration;
[ProtoMember(6)]
public bool Loop;
}
[Serializable, ProtoContract]
public class DataContainer
{
[ProtoMember(1)]
public SerializeData[] EventTemplateArray;
}
}
这里有个坑就是上面的代码中,涉及到了嵌套消息,在一个类中封装了另一个类,这里有很多坑,最开始我在外层类中直接new了数组的大小,而不是现在的申明,如果直接new了大小,那么最后在ProtoBuf-Net反序列化回来后会发现读了两倍于我们开的大小,它在做反序列化时,又给我们开了内存,而且这一部分内存是null,没有东西。然后我就改成了在Init里面开内存,在类里只申明,如下面初始化函数中开的1024个大小的数组空间。
初始化函数
public static DataContainer Init()
{
DataContainer Container = new DataContainer();
Container.EventTemplateArray = new SerializeData[1024];
for (int i = 0; i < 1024; i++)
{
Container.EventTemplateArray[i] = new SerializeData();
Container.EventTemplateArray[i].TmplateTy