1

在下面的示例中:

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);
4

1 回答 1

1

或者 protobuf-net 会将 Class1 中的 byte[] 作为已经序列化的数据处理?

Abyte[] 视为原始数据(并且在没有任何额外处理的情况下写入流),但仍然需要序列化一些小事情Class1- 写入标题字段和一般开销。在处理单个对象时,这两种方法都足够快,以至于任何区别都没有实际意义。但是,在大批量时,我有充分的理由怀疑序列化Class2会明显更快——因为处理单个序列化管道可以避免大量开销

Class1 序列化所花费的时间几乎是 Class2 序列化的两倍吗?

这将是一个很好的分析,但这将取决于您的典型数据。只有你能想出实际的数字。我希望“稍微长一点”。在这两个方面,我都在比较“序列化 class3 的成本,然后序列化由该输出组成的 class1”与“序列化由 class1 实例组成的 class3 的成本”

实际上,如果速度是您最关心的问题,我希望最佳方法是:

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

这种微妙的调整意味着它可以Class3以非缓冲、仅向前的方式写入(通过使用终止符而不是长度前缀)。这不是默认设置的唯一原因是谷歌明确更喜欢长度前缀方法。

于 2012-05-23T13:02:11.603 回答