我们正在使用protobuf来序列化和反序列化深对象图。这些图的一些成员实际上是在许多图之间反复重复,就像许多对象之间的多对一关系一样。例如,一个Sale对象将是一个图,它的Store成员(可能是它自己的子图)将仅仅是每10个可能的存储库中的一个,因此它将在许多消息(Sale图)中被反复重复。
如果我们能够以某种方式缓存这些对象的序列化,我们就可以获得明显的性能好处。理想情况下,我们希望告诉RuntimeModel,某些类型--在本例中是Store --应该通过扩展点来处理,就像代理一样,但是我们能够提供原始的序列化字节。
我们的约束之一是,生成的消息仍然应该与protobuf兼容,以便在没有这些“钩子”的情况下,其他平台(例如Python)中的客户端可以直接进行解析( Python客户端的性能优化!)。
我们查看了代理程序,但是它看起来,代理程序产生的任何东西(在我们的例子中是byte[]数组)仍然会被序列化为它的类型(即byte[]数组),因此与Python所期望的存储对象不兼容。
我们还查看了扩展,即使我们在一个额外的字段中以某种方式黑进了缓存的序列化存储,我们也会回到Python客户端的起点。
在这种情况下,我们还可以使用其他扩展机制吗?
发布于 2012-08-10 23:39:34
哦,真有意思。实际上,python需求破坏了我将要说的内容(引用跟踪)。您可以做的是先将这些数据序列化到byte[]
(通过MemoryStream
),然后将该数据作为byte[]
成员( byte[]
和原始对象之间没有区别--外部客户端不会注意到任何不同),但是在大多数情况下,这将不会比保持对象模型“原样”和多次序列化一些节点(序列化不是很慢)更快。
坦白地说,我会以不同的方式来存储它--因此,与其将存储作为子节点存储,不如将它们唯一地作为顶级节点存储一次,只需将一些唯一的标识符存储为查找(而不是子对象本身)。不过,这改变了布局。
不,没有内置的支持这一点,我不确定这是一个关键的场景支持。
https://stackoverflow.com/questions/11909520
复制相似问题