【问题标题】:Protobuf-net IsPacked=true and DataFormat = DataFormat.Group for list/array data of primitive typesProtobuf-net IsPacked=true 和 DataFormat = DataFormat.Group 用于原始类型的列表/数组数据
【发布时间】:2022-10-14 19:08:54
【问题描述】:

正如here 所解释的那样,在集合上使用“组”模式可以加快序列化速度,我想知道是否也可以将它用于打包的原始类型的列表/数组数据,例如下面的示例类。

[ProtoContract]
public class Foo
{
    [ProtoMember(1, IsPacked = true, DataFormat = DataFormat.Group)]
    public float[] Numbers { get; set; }
}

我正在使用 protobuf-net 2.4.0。

【问题讨论】:

    标签: c# protobuf-net


    【解决方案1】:

    组编码在这里根本不适用。组编码专门用于子对象 - 简单来说,它类似于使用 { 和 } 哨兵来开始/结束 JSON 子对象,而不是说“接下来的 542 个字节是子对象” -使用哨兵只需要添加已知值,而不是首先必须计算您尚未序列化的对象需要 542 个字节。

    在float 的快速中,它们总是被编码为固定大小(在这种情况下为 32 位)值。这里打包和不打包的区别最好写5个值;如果没有打包,它会说“下一个值是字段 1,固定 32(后跟 4 个字节)”,5 次(总共 25 个字节); where-与打包编码一样,它会说“下一个值是长度为 20 的字符串(后跟 20 个字节)”(只需执行 5 个项目 x 4 个字节),总共 22 个字节。对于大型集合,这种差异变得更加显着,尽管在不必解析多个字段标题等方面也有一些处理优势。在许多情况下,“打包”比你想象的要自动化一些,所以你可能发现它已经使用了packed(只要不指定Packed=false)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-20
      • 2013-07-13
      • 2011-09-04
      • 2016-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多