在下面的例子中:
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 :(得分:1)
或者protobuf-net会将Class1中的byte []作为已经序列化的数据处理吗?
将byte[]
视为原始数据(并在没有任何其他处理的情况下写入流中),但序列化Class1
仍然需要一些小的事情 - 写头字段和一般开销。在处理单个对象时,两种方法都足够快,任何差异都没有实际意义。但是,在高容量时,我有充分的理由怀疑序列化Class2
会明显加快 - 因为处理单个序列化管道可以避免大量开销
Class1序列化的时间几乎是Class2序列化的两倍吗?
这将是一个很好的配置文件,但它将取决于您的典型数据。只有你可以拿出实际的数字。我希望“稍长”。在这两个方面,我都在比较“序列化class3的成本,然后序列化由输出组成的class1”和“序列化由class1实例组成的class3的成本”
实际上,如果速度是您最关心的问题,我希望最佳方法是:
[ProtoContract]
class Class2
{
[ProtoMember(1, DataFormat = DataFormat.Group)]
public Class3 NonSerializedData { get; set; }
}
这种微妙的调整意味着它可以以非缓冲的,仅向前的方式编写Class3
(通过使用终结符而不是长度前缀)。这不是默认的唯一原因是谷歌显然更喜欢长度前缀方法。