Protobuf-net IsPacked=true用于用户定义的结构
本文关键字:定义 结构 用户 用于 IsPacked true Protobuf-net | 更新日期: 2023-09-27 18:09:26
目前是否可以为用户定义的结构使用IsPacked=true ?如果没有,未来有计划吗?
当我试图将该属性应用于类型为ColorBGRA8[]: System的字段时,我得到了以下异常。InvalidOperationException:只有简单的数据类型可以使用打包编码
我的情况是这样的:我正在编写一款游戏,并拥有各种内容的blable结构,如颜色,向量,矩阵,顶点,常量缓冲。他们的内存布局需要在编译时精确定义,以匹配例如从一个着色器恒定的缓冲区布局(在哪里字段一般?需要在16字节边界上对齐)。
我不想浪费任何人的时间,但是我找不到关于这个问题的任何最新信息。
回复后编辑
我目前正在测试一种解决方案,它使用protobuf-net几乎所有的东西,但大型数组的用户定义,但blable结构。所有自定义结构数组的字段都被字节数组所取代,字节数组可以被打包。在protobuf-net完成数据反序列化之后,我通过p/invoke使用内存,以便能够再次使用自定义结构数组。
下面的数字来自一个测试,该测试序列化了一个实例,该实例包含字节[]或ColorBGRA8[]的一个字段。原始测试数据为~38MiB的数据,例如在颜色数组中有1000000个条目。在内存中使用MemoryStream序列化。
写
平台。Copy + Protobuf: 51ms, Size: 38,15 MiB
Protobuf: 2093ms, Size: 109,45 MiB
平台。Copy + Protobuf: 43msProtobuf: 237ms
测试表明,对于包含或多或少随机数据的巨大的数组,可能会出现明显的内存开销。如果不是因为(反)序列化时间,这不是什么大问题。我知道protobuf-net可能不是为我的极端情况设计的,更不用说为它优化了,但这是我不愿意接受的。
我想我会坚持使用这种混合方法,因为protobuf-net在其他所有方面都非常好。
简单的"does not apply"。从编码规范中引用:
只有基本数字类型(使用varint、32位或64位连接类型的类型)的重复字段才能被声明为"打包"。
这不适用于自定义结构或类。这里应用的两种方法是字符串(长度前缀)和组(开始/结束令牌)。后者通常更便宜,但谷歌更喜欢前者。
Protobuf不被设计为任意匹配其他字节布局。它有自己的编码格式,并且仅设计用于处理/输出protobuf数据。这就像是在说"我正在编写XML,但我希望它看起来像{非XML}"。