2011-03-13 45 views
1

我需要最小化序列化类的大小。据我了解,序列化数据的大小取决于属性的名称。
因此类如何最小化序列化数据的大小

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

是系列化比

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

后小有没有办法来mimimalize第二类的大小,而不在第一个例子中更改属性的名称,以更短的版本是怎样的?我需要这个在Server.Cache中存储数据,所以它是二进制序列化。

+3

http://code.google.com/p/protobuf-net/可能是一个很好的候选 – Guillaume86 2011-03-13 18:47:30

回答

3

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

在你的情况下,使用protobuf网:

[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花费较少的空间)。

+0

你已经创建了完美的序列化器,谢谢:) – 2011-03-14 09:43:59

+0

@Korin - 公平地说,虽然我可能*实现了*,*设计*有谷歌... – 2011-03-14 11:57:23

2

如果使用XML序列化,是的,你可以:

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

,如果它是一个二进制序列化,就没有必要为它。

+0

重新您的最后一行;这是不正确的,或者更确切地说:这取决于序列化程序。 protobuf不会在意,但BinaryFormatter使用字段名和字段名*通常*取决于属性名,特别是对于自动实现的属性。 – 2011-03-13 19:32:53

+0

谢谢马克。我会更新我的答案。 – Aliostad 2011-03-13 19:36:35