原始语音消息中的自引用字段

2022-09-03 13:47:33

可以有这样的消息吗?

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

原因是我目前的协议直接存储A的集合,将A包装在另一条消息中将导致存储数据的大量转换。

2.2.0 protoc 编译正常。这是否会给序列化/反序列化带来任何问题,并且protobuf-net是否支持它。


答案 1

这是一个非常好的定义,应该适用于任何实现(包括protobuf-net);你看到任何问题吗?然而!您可能需要考虑序列化的计算影响 - 特别是,要序列化子消息,首先需要知道子消息的大小。深度递归方法(此链接列表需要)可能会导致一些问题。

有什么理由不能只是一条消息吗?到目前为止,这将是我的偏好。repeated


答案 2

我不知道protobuf-net,但它应该是绝对好的。我怀疑如果它在protobuf-net中不起作用,Marc会将其视为一个错误,并修复它......这当然是我在C#端口:)

(实际上,我不容易看出这会是一个问题......这不像消息将由结构表示,递归将是一个问题。

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

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


推荐