如何最小化序列化数据的大小

时间:2011-03-13 18:25:15

标签: c# performance serialization

我需要最小化序列化类的大小。据我所知,序列化数据的大小取决于属性的名称 所以上课

class XYZ
{
public int X { get;set;}
}
序列化后

小于

class XYZ
{
public int NumberOfUsersWithAccessToReportingService { get;set;}
}

有没有办法在不将属性名称更改为较短版本的情况下模仿第二类的大小,如第一个示例中所示?我需要这个在Server.Cache中存储数据,所以它是二进制序列化。

2 个答案:

答案 0 :(得分:3)

如果尺寸是你的目标,像protobuf这样简洁的东西会很好;考虑一些措施:Performance Tests of Serializations used by WCF Bindings

在您的情况下,使用protobuf-net:

[ProtoContract]
class XYZ
{
    [ProtoMember(1)]
    public int NumberOfUsersWithAccessToReportingService { get;set;}
}

大小不依赖于成员名称,它是纯二进制的,没有文本开销,并且它对大多数数据类型使用有效的编码。用法示例:

using(var file = File.Create(path))
{
    Serializer.Serialize(file, obj);
}
...
using(var file = File.OpenRead(path))
{
    var obj = Serializer.Deserialize<YourType>(file);
}

实际上,上面的类型将介于2到6个字节之间,具体取决于属性的值(接近0的整数占用较少的空间)。

答案 1 :(得分:2)

如果您使用的是XML序列化,那么您可以:

class XYZ
{
    [XmlElement("X")]
    public int NumberOfUsersWithAccessToReportingService { get;set;}
}

如果是二进制序列化,则不需要它。