2013-01-02 58 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

等等等等...

現在,使用protobuf網通過WCF傳輸這些類型的實例時,只有「4級」類的屬性轉移 - 從所有的屬性基類會丟失!

從其他幾個StackOverflow的線程(hereherehere),我讀這是默認行爲,你有兩種選擇來解決它:

  1. 使用[ProtoInclude]屬性的基礎上,類。
  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),但* not *當前在繼承方面表現不錯,僅適用於平面模型。那麼,我打算*爲更復雜的模型,但有一些咕嚕工作需要做到這一點。 –

相關問題