3

データのシリアル化の倹約を検討しています。しかし、ドキュメントは言う

循環構造体 - 構造体には、その前に宣言された構造体のみを含めることができます。構造体もそれ自体を含むことはできません

私たちの要件の1つは

  • 構造体A
    • 子アイテム一覧
      • アイテム (アイテムは構造体 A )

だから、要件を読んで、どのレベルでも構造体をそれ自体に含めることはできませんか? 上記のように循環モデルで使用できますか。構造体は構造体の直接のメンバーではありませんが、他のメンバーがあり、構造体が含まれています。

彼らの文書はあまり説明的ではありません。

スリフトでそれは可能ですか?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 に答える