3

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

循环结构 - 结构只能包含在它之前声明的结构。结构也不能包含自身

我们的要求之一是

  • 结构 A
    • 子项列表
      • 项目(项目是 Struct A )

所以阅读要求我不能在任何层面上都有自己的结构?我可以像上面那样在循环模型中使用它吗?Struct 不是 Struct 的直接成员,但它有一些其他成员并且它包含结构。

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

在 Thrift 中可以吗?protobuf 支持吗?

4

2 回答 2

2

是的,从 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
}

但仍有一些警告。开发者负责不产生无限循环或菱形引用,例如

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
于 2014-06-17T08:58:37.757 回答
2

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

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

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

subitems 本质上是指向 AllAs.items 的指针列表

在 Protocol Buffers 中,这很简单:

message A {
    repeated A subitems = 1; 
}
于 2010-06-10T05:24:26.307 回答