2011-05-10 84 views
6

可以有这样的消息吗?protobuf消息中的自引用字段

message A { 
    required int64 some_number = 1; 
    // .... some more fields 
    optional A sub_a = 123; 
} 

原因是把我当前协议的商店里直接和包裹A在另一条消息会导致存储的海量数据转换。

2.2.0 protoc编译好了。 这可以使序列化/反序列化的任何问题,并由protobuf网支持。

回答

7

这是一个完全正常的定义,应该在任何实现工作(包括protobuf网);你有没有看到任何问题?然而!您可能需要考虑序列化的计算影响 - 特别是序列化子消息时,需要知道子消息的大小第一个。深度递归的方法(如该链接列表所需)可能会导致一些问题。

是否有任何理由不能只是一个repeated消息呢?那到目前为止是我的偏好。

+0

当前协议正在发送和存储A消息,而不是重复A字段的包装器B.改变协议更加有效,然后仅向A添加字段。在B情况下,我需要将所有存储的数据转换为新的消息类型或支持A和B消息。 – 2011-05-10 08:51:33

2

我不知道protobuf网,但它应该是绝对好的。我怀疑,如果它确实在protobuf网不工作,马克将计为一个错误,并修复它......这是肯定我会带我的C#端口:)

(实事求是的态度,我不能很容易地看到这将是一个问题......它不像消息将由结构表示,递归会成为一个问题。)

它应该很容易测试 - 我建议你试试一下,看看是否遇到任何问题。你真正需要做的就是创建一条消息,并测试你是否可以正确序列化和反序列化它,可能是在不同的平台之间。

编辑:显然,你需要确保有没有实际的周期在消息本身而言...

+0

我可以看到一些问题,如果这(链表)过长... – 2011-05-10 05:41:31

+0

我测试它与谷歌的实施,而不是protobuf网侧,我没有太多的访问。 – 2011-05-10 08:48:16

+0

它工作正常顺便说一句:) – 2011-05-10 08:48:33