protobuf-net中原始类型打包列表同时用IsPacked与Group格式是否可行?
关于protobuf-net 2.4.0中IsPacked与DataFormat.Group的使用疑问解答
有说法提到集合采用group模式可提升序列化速度,想了解在protobuf-net 2.4.0版本中,对示例类里的float数组(原始类型打包列表),同时设置
IsPacked = true与DataFormat = DataFormat.Group是否合适?
示例代码:[ProtoContract] public class Foo { [ProtoMember(1, IsPacked = true, DataFormat = DataFormat.Group)] public float[] Numbers { get; set; } }
结论:同时设置这两个属性不合适,且二者互斥
IsPacked=true:对应Protobuf的「打包字段」特性,专门针对重复的原始类型字段(比如float数组)做优化,把多个值打包进一个二进制块,用长度前缀存储,是官方推荐的高效序列化方式。DataFormat=DataFormat.Group:对应Protobuf早期的「组格式」,用于嵌套消息的序列化,现在已被官方消息类型替代,且该逻辑和原始类型的打包字段完全不兼容。
在protobuf-net 2.4.0中,当同时设置这两个属性时,IsPacked=true会优先生效,DataFormat.Group会被直接忽略,不会产生任何额外的性能提升,反而会造成代码逻辑混淆。
正确写法
针对float数组这类原始类型集合,仅需设置IsPacked=true即可:
[ProtoContract] public class Foo { [ProtoMember(1, IsPacked = true)] public float[] Numbers { get; set; } }
内容的提问来源于stack exchange,提问作者ilCosmico
相关产品推荐
相关产品推荐

