Apache бережливость, структура содержит себя - PullRequest
2 голосов
/ 10 июня 2010

Я ищу экономию для сериализации данных.Но в документе сказано:

циклические структуры - Структуры могут содержать только структуры, которые были объявлены до него.Структура также не может содержать себя

Одним из наших требований является

  • Структура A
    • Список дочерних элементов
      • Элементы (элементытакое Struct A)

Итак, требования к чтению, я не могу иметь Struct внутри себя на любом уровне?Могу ли я иметь его в циклической модели, как у меня выше.Struct не является членом Struct напрямую, но имеет некоторый другой член и содержит struct.

Их документ не так хорошо описательный.

Возможно ли это в Thrift?Поддерживает ли protobuf это?

Ответы [ 2 ]

2 голосов
/ 10 июня 2010

Согласно этой дискуссии , это невозможно в Thrift.Тем не менее, существует обходной путь использования целых чисел для индексации в главном списке.По сути, это форма указателей бедняков.

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

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

Подразделы - это, по сути, список указателей на AllAs.items

В протокольных буферах это просто:

message A {
    repeated A subitems = 1; 
}
1 голос
/ 17 июня 2014

Да, начиная с 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
...