2013-04-16 16 views
1

当前是否可以对用户定义的结构使用IsPacked = true?如果不是,那么它是否计划在未来?对于用户定义的结构,Protobuf-net IsPacked = true

,我发现了以下情况例外,当我试图把该属性应用于类型ColorBGRA8 []的一个领域:System.InvalidOperationException:只有简单的数据类型可以使用分组编码

我的情况是如下所示:我正在编写一个游戏,并为诸如颜色,向量,矩阵,顶点和常量缓冲区等各种各样的东西提供了大量可循环结构。他们的内存布局需要在编译时精确定义,以便匹配例如来自着色器的常量缓冲区布局(其中字段通常需要在16字节边界上对齐)。

我不是故意浪费任何人的时间,但我找不到有关这个特定问题的任何最新信息。后

编辑已经回答了

我目前正在测试它使用protobuf网几乎一切,但大型阵列的用户定义,但blitable结构的解决方案。我自定义结构数组的所有字段都被字节数组替换,可以打包。在protobuf-net完成反序列化数据后,我通过p/invoke使用memcpy,以便能够再次使用自定义结构数组。

以下数字来自一个测试,该测试序列化一个包含byte []或ColorBGRA8 []的字段的实例。测试数据是大约38MiB的数据,例如原始。颜色数组中有1000000个条目。序列化是使用MemoryStream的内存之一。

写作
Platform.Copy +的Protobuf:51ms,尺寸:38,15 MIB
的Protobuf:2093ms,尺寸:109,45 MIB

阅读
Platform.Copy +的Protobuf:,持续时间43ms 的Protobuf: 2307ms

该测试表明,对于巨大的阵列或多或少的随机数据,可能会出现明显的内存开销。如果不是(序列化)时间的话,这不会是一件大事。我知道protobuf-net可能不适合我的极端情况,更不用说为它优化了,但这是我不愿意接受的。

我想我会坚持使用这种混合方法,因为protobuf-net对其他方面都非常有效。

回答

3

只是“不适用”。从encoding specification引证:

原始数字类型的只有重复场(其使用varint类型,32位,或64位线的类型)可以声明“打包”。

这不适用于自定义结构或类。这里适用的两种方法是字符串(长度前缀)和组(开始/结束标记)。后者编码通常更便宜,但Google更喜欢前者。

Protobuf不是为了任意匹配其他字节布局而设计的。它是它自己的编码格式,仅用于处理/输出protobuf数据。这就像是说“我在写XML,但我希望它看起来像{non-xml}”。

+0

感谢您的快速回答以及不支持的原因。这清除了一切。 – Simon