2013-01-02 3 views
2

우리 엔티티 모델에는 다소 복잡한 계층 구조 클래스가 있습니다. 우리는 모든 엔티티에 기본 클래스 BaseEntity을 가지고 있고 BaseEntity에서 파생 된 "레벨 2"클래스, "레벨 2"클래스에서 파생 된 "레벨 3"클래스, "레벨 2"클래스에서 파생 된 "레벨 4" 레벨 3 "클래스. 즉 우리가 이런 걸 가지고, 의미protobuf-net을 사용하여 기본 클래스 속성 직렬화

  • BaseEntity를
    • DerivedEntity_1
      • DerivedEntity_1_1
        • DerivedEntity_1_1_1
        • DerivedEntity_1_1_2
        • DerivedEntity_1_1_3
      • DerivedEntity_1_2
        • DerivedEntity_1_2_1
        • DerivedEntity_1_2_2
    • DerivedEntity_2
      • DerivedEntity_2_1
        • DerivedEntity_2_1_1
      • DerivedEntity_2_2
        • DerivedEntity_2_2_1
        • DerivedEntity_2_2_2
        • DerivedEntity_2_2_3
        • DerivedEntity_2_2_4
  • 012 3,516,

그리고 기타 등등 ...

protobuf - 인터넷 사용 WCF를 통해 이러한 유형의 인스턴스를 전송할 때 지금의 '레벨 4'클래스의 속성 만이 전송됩니다 -로부터 모든 속성 기본 클래스가 손실됩니다!

  1. 베이스에 [ProtoInclude] 속성을 사용

    여러 가지 다른 StackOverflow의 스레드에서

    (here, herehere)는, 당신이 그것을 해결하는 두 가지 옵션을 가지고이 기본 동작이다 읽고 수업.

  2. 런타임에 TypeModelAddSubType()을 사용하여 상속을 구성하십시오.

그러나 우리는 파생 된 클래스가 많기 때문에이 옵션을 사용할 수 없습니다. 옵션 1은 레벨 1 기본 클래스에서 수백 개의 속성을 의미합니다. 옵션 2는 AddSubType()으로 많은 전화를 의미합니다.

다른 옵션이 있습니까?

답변

0

궁극적으로 데이터를 저장하는 방법을 이해해야합니다. 따라서 데이터를 다시 가져올 수 있습니다. 그것은 단지 짐작할 수 없습니다 ... 그래서 : 그것을 할 수있는 유일한 확실한 방법은 모델을 어딘가에 정의하는 것입니다. 물론 원시 코드 일 필요는 없습니다. 예를 들어 런타임에 포함하고 처리하는 (AddSubType을 통해) 외부 파일에 저장 될 수 있습니다.

+0

그러나 기본 WCF 직렬 변환기는 어떻게 수행합니까? 그것은 그것과 완벽하게 작동합니다. (글쎄, 느린 점만 제외하면 ...) 우리는 protobuf에서도 같은 전략을 사용할 수 있습니까? – gehho

+0

@gehho'DataContractSerializer'는 요소 등을 통한 자세한 이름 지정을 포함하여 사치품을 이해할 수있게 해주는 고급 스러움을 가지고 있습니다. protobuf 명세 *에는 그것을위한 공간이 없다. 극히 간결한 필드 식별자 (정수)를 얻을 수 있습니다. 생각할 수있는 메커니즘이 없다면'12'는'DerivedEntity_2_2_3'을 의미하며, 코드가 어떤 식 으로든 편집 될 때 (예를 들어, 누군가 Derived_Entity_2_2_1b를 추가 할 때) 큰 문제를 일으킬 위험이 없다는 것을 이해할 수 있습니다. –

+0

@gehho 최근에는 스트림에 유형 정보를 임베드하여 동적 유형 지정을 지원하는 일부 기능 (protobuf-net 전용)이 있지만 현재 상속 기능을 제대로 수행하지 못하고 있으며 플랫 모델 전용입니다. 글쎄, 나는 더 복잡한 모델을 위해 * 의도하지만, 그런 일을하기 위해 필요한 약간의 일이있다. –

관련 문제