Apache thrift,struct包含自己

时间:2010-06-10 04:47:20

标签: protocol-buffers thrift thrift-protocol

我正在研究thrift的数据序列化。但文件说

循环结构 - 结构只能包含之前已声明的结构。结构也不能包含

我们的要求之一是

  • 结构A.
    • 儿童用品清单
      • 项目(项目为结构A)

所以阅读要求我不能在任何级别内拥有Struct?如上所述,我可以在循环模型中使用它吗? Struct不是Struct的成员,但它有一些其他成员,它包含struct。

他们的文件描述性不是很好。

Thrift有可能吗? protobuf支持吗?

2 个答案:

答案 0 :(得分:2)

根据this discussion,在Thrift中是不可能的。但是,有一种使用整数索引到主列表的解决方法。从本质上讲,这是穷人指针的一种形式。

struct A 
{ 
1: list<i32> subitems; 
}

struct AllAs 
{ 
1: list<A> items; 
} 

subitems本质上是指向AllAs.items

的指针列表

在Protocol Buffers中,它是微不足道的:

message A {
    repeated A subitems = 1; 
}

答案 1 :(得分:1)

是的,从Thrift 0.9.2开始支持此方案

对于任何早期版本的thrift,以下(故意)会导致编译器错误消息:

struct Foo {
  1 : Foo foo     // error - Foo not fully defined yet
  2 : Bar bar     // error - Bar not defined yet
}

struct Bar {
  1 : Foo left     // ok, Foo has been defined earlier
  2 : Foo right    // ok, Foo has been defined earlier
}

但仍有一些警告。 deveoper负责不生成无限循环或钻石参考,如

var foo = new Foo();
foo.foo = foo;    // will crash on serialization with stack overflow

var bar = new Bar();
bar.left = foo;
bar.right = foo;   // points to same object only BEFORE deserialization