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_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
- DerivedEntity_1
等等等等...
現在,使用protobuf網通過WCF傳輸這些類型的實例時,只有「4級」類的屬性轉移 - 從所有的屬性基類會丟失!
從其他幾個StackOverflow的線程(here,here和here),我讀這是默認行爲,你有兩種選擇來解決它:
- 使用
[ProtoInclude]
屬性的基礎上,類。 - 使用
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),但* not *當前在繼承方面表現不錯,僅適用於平面模型。那麼,我打算*爲更復雜的模型,但有一些咕嚕工作需要做到這一點。 –