2013-03-19 2 views
2

노드에 자식 포인터와 부모 포인터가 모두있는 트리 구조가 있습니다. 이 문제는 구성에 사용되므로 작업/구성 관리자에게 다소 읽기 쉽도록해야합니다. 직렬화 규칙과 특성을 여러 가지 조합으로 실험 한 후에도 여전히 문제가 있습니다.부모 및 자식 포인터가있는 트리를 Raven에 저장

내 유형은 다음과 같이 : 이것은 분명히 최종 사용자에게 혼란을

 "$id": "3", 
     "_children": { 
      "ConfigurationItem": { 
      "$id": "4", 
      "_children": {}, 
      "_parent": { 
       "$ref": "3" 
      }, 
      "_value": "Some value" 
      } 
     }, 

, 그들은 :

public class NestedConfigurationTree<T> where T : class 
{ 
    public InternalNode<T> _root { get; set; } 

    public class InternalNode<TValue> where TValue : class 
    { 
     public Dictionary<string, InternalNode<TValue>> _children { get; set; } 
     public InternalNode<TValue> _parent { get; set; } 
     public TValue _value { get; set; } 
    } 
} 

내가 순환 참조 ([JsonObject(IsReference = true)])을 허용하면, 각 노드는 JSON이처럼 보이는 얻는다 $ id 및 _parent 항목을 원하지 않습니다. 부모는 문서 구조에서 아주 분명하기 때문에 직렬화를 피하고로드 할 때 어떻게 든 다시 만들 수 있습니까?

또한 공개 속성을 피할 수 있습니까? 원래는 private readonly 필드로 썼지 만, 이로 인해 시리얼 라이저가 모든 필드를 무시하게되었습니다.

+0

왜 최종 사용자는 원시 JSON을보고 있습니까? –

+0

@AyendeRahien : 구성 관리 도구 용이며 원시 데이터를 "데이터베이스 관리 도구에서 쉽게 편집 할 수 있어야"하는 요구 사항입니다. 기본적으로 도구가 손상되면 데이터베이스에 들어가서 설정을 변경할 수 있기를 원합니다. – carlpett

답변

0

데이터베이스에 직접 저장하는 것이 적합하지 않습니다. 그러한 시나리오의 훌륭한 예를 보여주었습니다. 귀하의 최종 사용자가 혼란스러워한다면, 당신은 그것에 대해 작성하고자하는 모든 쿼리를 원할 것입니다.

내 추천은 이러한 참조가없는 트리 버전을 갖는 것입니다.

직렬화
{ 
    "Value" : "A", 
    "Children" : [ 
    { 
     "Value" : "B", 
     "Children" : [ 
     { 
      "Value" : "C", 
      "Children" : [ 
      { 
       "Value" : "D", 
      } 
      ] 
     }, 
     { 
      "Value" : "E", 
      "Children" : [ 
      { 
       "Value" : "F", 
       "Children" : [] 
      }, 
      { 
       "Value" : "G", 
       "Children" : [] 
      } 
      ] 
     } 
     ] 
    } 
    ] 
} 

, 당신은 단지 부모/자식 링크를 무시하는 것입니다 당신이 백업을 연결할 것이다 역 직렬화 할 때 : 직렬화 등처럼 보이는.

두 번째 클래스 집합 대신 사용자 정의 JsonConverter에서이 모든 작업을 수행 할 수 있습니다. 특정 엔터티를 serialize하거나 deserialize하는 방법을 세밀하게 제어 할 수 있습니다.

또 다른 옵션 (그리고 아마도 가장 간단한 방법)은 순회 링크의 속성 대신 메서드를 사용하는 것입니다. 대신 즉, :

Node Parent { get; } 
IEnumerable<Node> Children { get; } 

당신은 사용합니다 :

방법이 직렬화시에 다음되지 않기 때문에이 할 수있는 가장 쉬운 일이 될 수 있습니다
Node GetParent(); 
IEnumerable<Node> GetChildren(); 

.

관련 문제