Protobuf消息中的自引用字段

17

这样的信息是否可行?

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

原因是我的当前协议直接存储一组A,将A包装在另一个消息中会导致大量存储的数据进行转换。

2.2.0 protoc可以成功编译它。 这会对序列化/反序列化造成任何问题吗?protobuf-net支持吗?

2个回答

20

这个定义完全没问题,应该在任何实现中(包括 protobuf-net)都可以正常工作;你有看到任何问题吗?但是!你可能需要考虑序列化的计算影响 - 特别是要序列化子消息,必须首先知道子消息的大小。一个深度递归的方法(如此链表所需)可能会带来一些问题。

有什么理由不能只将其作为repeated消息呢?那绝对是我更喜欢的方法。


当前协议正在发送和存储A消息,而不是带有重复A字段的包装器B。更改协议比仅向A添加字段要复杂得多。例如,在B情况下,我需要将所有存储的数据转换为新的消息类型或支持A和B消息。 - float_dublin

3
我不了解protobuf-net,但它应该完全没问题。如果在protobuf-net中无法工作,我认为Marc会将其视为错误并加以修复...这肯定是我在C#端口中采取的态度 :)
实际上,我很难看出它会成为一个问题......不像消息将由结构体表示,递归将成为一个问题。
测试应该相当容易——建议您尝试一下小型消息,并查看是否遇到任何问题。您真正需要做的就是创建一条消息并测试您是否可以正确序列化和反序列化它,可能在不同的平台之间。
编辑:显然,您需要确保消息本身没有实际循环...

我已经使用谷歌的实现进行了测试,而不是 protobuf-net 的实现,因为我没有太多访问权限。 - float_dublin
@float_dublin:如果你要使用protobuf-net, 那么你应该能够访问它,不是吗? - Jon Skeet
我发布了一些proto文件和一些文档来描述字节级协议。protobuf-net方面并不是由我制作的。而且,能够在不破坏旧版本软件的情况下添加新功能是我最喜欢protobuf的优点。 - float_dublin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接