우리 엔티티 모델에는 다소 복잡한 계층 구조 클래스가 있습니다. 우리는 모든 엔티티에 기본 클래스 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_1_1
- 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
- DerivedEntity_2_1
012 3,516,
- DerivedEntity_1
그리고 기타 등등 ...
protobuf - 인터넷 사용 WCF를 통해 이러한 유형의 인스턴스를 전송할 때 지금의 '레벨 4'클래스의 속성 만이 전송됩니다 -로부터 모든 속성 기본 클래스가 손실됩니다!
- 베이스에
[ProtoInclude]
속성을 사용 여러 가지 다른 StackOverflow의 스레드에서(here, here 및 here)는, 당신이 그것을 해결하는 두 가지 옵션을 가지고이 기본 동작이다 읽고 수업.
- 런타임에
TypeModel
및AddSubType()
을 사용하여 상속을 구성하십시오.
그러나 우리는 파생 된 클래스가 많기 때문에이 옵션을 사용할 수 없습니다. 옵션 1은 레벨 1 기본 클래스에서 수백 개의 속성을 의미합니다. 옵션 2는 AddSubType()
으로 많은 전화를 의미합니다.
다른 옵션이 있습니까?
그러나 기본 WCF 직렬 변환기는 어떻게 수행합니까? 그것은 그것과 완벽하게 작동합니다. (글쎄, 느린 점만 제외하면 ...) 우리는 protobuf에서도 같은 전략을 사용할 수 있습니까? – gehho
@gehho'DataContractSerializer'는 요소 등을 통한 자세한 이름 지정을 포함하여 사치품을 이해할 수있게 해주는 고급 스러움을 가지고 있습니다. protobuf 명세 *에는 그것을위한 공간이 없다. 극히 간결한 필드 식별자 (정수)를 얻을 수 있습니다. 생각할 수있는 메커니즘이 없다면'12'는'DerivedEntity_2_2_3'을 의미하며, 코드가 어떤 식 으로든 편집 될 때 (예를 들어, 누군가 Derived_Entity_2_2_1b를 추가 할 때) 큰 문제를 일으킬 위험이 없다는 것을 이해할 수 있습니다. –
@gehho 최근에는 스트림에 유형 정보를 임베드하여 동적 유형 지정을 지원하는 일부 기능 (protobuf-net 전용)이 있지만 현재 상속 기능을 제대로 수행하지 못하고 있으며 플랫 모델 전용입니다. 글쎄, 나는 더 복잡한 모델을 위해 * 의도하지만, 그런 일을하기 위해 필요한 약간의 일이있다. –