2010-06-10 16 views
2

Je suis à la recherche de l'épargne pour la sérialisation des données. Mais Document indiqueApache thrift, struct contient lui-même

structures cycliques - Les structures ne peuvent contenir que des structures qui ont été déclarées avant. Un struct peut aussi ne pas contenir lui-même

Un de nos besoins est

  • struct A
    • Liste des articles pour enfants
      • Articles (Les articles sont struct A)

Donc l'exigence de lecture je ne peux pas avoir Struct à l'intérieur de lui-même à n'importe quel niveau? Puis-je l'avoir dans un modèle cyclique comme je l'ai ci-dessus. Struct n'est pas membre de Struct directement mais il a un autre membre et il contient struct.

Leur document n'est pas très descriptif.

Est-ce possible dans Thrift? Est-ce que protobuf le supporte?

Répondre

2

Selon this discussion, ce n'est pas possible dans Thrift. Cependant, il existe une solution de contournement consistant à utiliser des entiers pour indexer dans une liste principale. Essentiellement, c'est une forme de pointeurs du pauvre.

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

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

est essentiellement sous-éléments d'une liste de pointeurs dans AllAs.items

Dans Buffers Protocole, il est trivial:

message A { 
    repeated A subitems = 1; 
} 
1

Oui, commençant par Thrift 0.9.2 ce scénario est pris en charge .

Avec une version antérieure de Thrift le plomb suivant (intentionnellement) à un message d'erreur du compilateur:

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 
} 

Il y a encore quelques mises en garde cependant. Le deveoper est responsable de ne pas produire des boucles sans fin ou des références de diamant, comme

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 
+0

struct barre de gauche doit contenir droite ID différents –

+0

fixes, grâce à la capture! – JensG