如何在protobuf中定义循环?

时间:2014-06-01 09:00:16

标签: java c++ protocol-buffers

说我有以下mode.proto文件:

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

message EntityE {
    optional EntityD dPointer = 1;
    optional int32 eField = 2;
}

这有两个实体--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()));
}

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

same d: false 
same e: false

enter image description here

IS 在创建的模型中有一个循环,但只是以一定的深度开始。

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

1 个答案:

答案 0 :(得分:6)

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

基本上,不要这样做。

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