2010-06-10 4 views
2

데이터의 직렬화를 위해 절약을 조사하고 있습니다. 그러나 문서는Apache 절약, 구조체 자체 포함

순환 구조체라고 말합니다 - 구조체는 그 앞에 선언 된 구조체 만 포함 할 수 있습니다. 구조체는 또한 우리의 요구 사항

하나는 자식 항목의

  • 목록
    • 항목 (항목 구조체 각각 A)
    • 구조체 A는 자신을 포함 할 수 없습니다

그래서 어느 레벨에서든 구조 자체를 가질 수없는 독서 요구 사항은 무엇입니까? 위와 같은 순환 모델을 사용할 수 있습니까? Struct은 Struct의 멤버가 아니지만 다른 멤버가 있고 struct가 들어 있습니다.

문서의 내용이 잘 설명되지 않습니다.

스 리프트에서 가능합니까? protobuf가 지원합니까?

답변

2

this discussion에 따르면, Thrift에서는 불가능합니다. 그러나 정수를 사용하여 마스터 목록에 색인을 작성하는 해결 방법이 있습니다. 근본적으로, 이것은 가난한 사람의 포인터의 한 형태입니다.

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

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

하위 항목은 기본적으로 AllAs.items

프로토콜 버퍼에서

에 포인터의 목록입니다, 그것은 사소한 :

message A { 
    repeated A subitems = 1; 
} 
1

예, 는 중고품 할인 0.9.2로 시작하는이 시나리오을 지원 . 중고품의 이전 버전 컴파일러 오류 메시지에 다음 (의도적으로) 리드

:

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

구조체 왼쪽에 다른 ID가 포함되어야합니다. –

+0

고정되어있어서 감사합니다! – JensG