说我有以下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
IS 在创建的模型中有一个循环,但只是以一定的深度开始。
这是probuf生成的java代码的问题吗? protobuf是否正式支持图表中的周期? 在其他protobuf"输出"中的预期结果是什么?语言? (即c ++)
答案 0 :(得分:6)
protobuf格式不包含对象标识,并且没有参考/图形支持的概念。它只是一棵基本的树。除此之外的任何内容都是特定于实现的,而不是规范的一部分。
基本上,不要这样做。
这种情况并不罕见:许多序列化程序也是如此,包括XML和json序列化程序。对于这些情况,同样,一些实现可能支持本地的身份定义 - 但在一般情况下不保证。