2012-05-23 22 views
1

在下面的示例中:ProtoBuf-Net性能

Class1的序列化会花费两倍长的Class2序列化吗?或者protobuf-net将Class1中的byte []处理为已序列化的数据?

伪例如:

[ProtoContract] 
class Class1 
{ 
    [ProtoMember(1)] 
    public byte[] SerializedData { get; set; } 
} 

[ProtoContract] 
class Class2 
{ 
    [ProtoMember(1)] 
    public Class3 NonSerializedData { get; set; } 
} 

[ProtoContract] 
class Class3 
{ 
    [ProtoMember(1)] 
    public string Address{ get; set; } 

    [ProtoMember(2)] 
    public string ZipCode{ get; set; } 

    [ProtoMember(2)] 
    public string Country{ get; set; } 
} 

Class3 _c3 = new Class3() { Address = "MyAddress", ZipCode = "90210", Country = "AZ" } 

// Class 1 Serialization 
Class1 _c1 = new C1(); 
_c1.SerializedData = protobuf.Serialize(_c3); 

byte[] c1Bytes = protobuf.Serialize(_c1); 

// Class 2 Serialization 
Class2 _c2 = new Class2(); 
_c2.NonSerializedData = _c3; 

byte[] c2Bytes = protobuf.Serialize(_c2); 
+0

您可以使用我博客文章中的代码自行测试 - http://maxondev.com/serialization-performance-comparison-c-net-formats-frameworks-xmldatacontractserializer-xmlserializer-binaryformatter-json-newtonsoft-servicestack -文本/ – Maxim

回答

1

还是会protobuf网处理Class1中为已序列化的数据的字节[]?

byte[]作为原始数据处理(和被写入到该流没有任何额外的加工),但仍有序列化Class1需要一些次要的事情 - 写头字段,和一般的开销。在处理单个物体时,两种方法都足够快速,以至于任何区别都没有意义。在高容量,不过,我有充分的理由怀疑序列化Class2将明显快 - 与一个单一的序列化流水线处理避免了一些开销

将Class1的系列化需要将近两倍长的Class2序列化?

这将是一个很好的概况,但它取决于你的典型数据。只有你可以拿出实际的数字。我希望“略长”。在这两个比较中,我比较了“序列化class3的成本,然后序列化一个由该输出组成的class1”vs“对由class1实例组成的class3进行序列化的代价”

实际上,如果速度是您的首要关注,我希望的最佳的方法是:

[ProtoContract] 
class Class2 
{ 
    [ProtoMember(1, DataFormat = DataFormat.Group)] 
    public Class3 NonSerializedData { get; set; } 
} 

这种微妙的调整意味着,它可以在非缓冲,转发-唯一方式写Class3(通过使用一个终止子,而不是一个长度前缀)。这不是默认的唯一原因是google明确偏好长度前缀方法。