如何在protobuf中定义循环?

rad*_*dai 4 c++ java protocol-buffers

说我有以下mode.proto文件:

message EntityD {
    optional EntityE ePointer = 1;
    optional int32 dField = 2;
}

message EntityE {
    optional EntityD dPointer = 1;
    optional int32 eField = 2;
}
Run Code Online (Sandbox Code Playgroud)

这有两个实体--D和E,它们允许交叉链接.我的问题是,从以上*.proto生成java代码后无法创建一个循环:

public static void main(String[] args) throws Exception {
    Model.EntityD.Builder dBuilder = Model.EntityD.newBuilder();
    Model.EntityE.Builder eBuilder = Model.EntityE.newBuilder();

    dBuilder.setDField(42);
    eBuilder.setEField(7);
    dBuilder.setEPointer(eBuilder);
    eBuilder.setDPointer(dBuilder);

    Model.EntityD d = dBuilder.build();
    Model.EntityE e = eBuilder.build();

    System.err.println("same d: "+(d==e.getDPointer()));
    System.err.println("same e: "+(e==d.getEPointer()));
}
Run Code Online (Sandbox Code Playgroud)

我试图创建一个简单的D < - > E循环.相反,我得到这个:

same d: false 
same e: false
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

IS周期中创建的模型,但只有具有一定深度的开始.

这是probuf生成的java代码的问题吗?protobuf是否正式支持图表中的周期?其他protobuf"输出"语言的预期结果是什么?(即c ++)

Mar*_*ell 6

protobuf格式不包括对象标识,并且没有参考/图形支持的概念.它只是一棵基本的树.除此之外的任何内容都将是特定于实现的,而不是规范的一部分.

基本上,不要这样做.

这并不罕见:许多序列化程序也是如此,包括XML和json序列化程序.对于这些情况,同样,一些实现可能支持本地的身份定义 - 但在一般情况下不能保证.

  • Cycles为任何序列化格式添加了大量复杂功能.检测它们需要维护一些非常昂贵的哈希表,并且接收端也需要额外的簿记.绝大多数用例都不会从这笔额外费用中获得任何收益.此外,它可能是一个安全问题:如果接收器期望某种树并且意外地获得一个循环,它们很容易陷入无限循环.由于所有这些原因,大多数序列化协议(无论是文本还是二进制)都不支持它们. (2认同)