2010-04-19 64 views
3

我想序列化一個ItemTransaction和protobuf網(r282)有問題。protobuf-net可以序列化這個接口和泛型集合的組合嗎?

ItemTransaction : IEnumerable<KeyValuePair<Type, IItemCollection>></code> 

和ItemCollection是這樣的:

FooCollection : ItemCollection<Foo> 
ItemCollection<T> : BindingList<T>, IItemCollection 
IItemCollection : IList<Item> 

其中T是項目的派生類型。 ItemCollection也有一個類型爲IItemCollection的屬性。

我序列化是這樣的:

IItemCollection itemCol = someService.Blah(...); 
... 
SerializeWithLengthPrefix<IItemCollection>(stream, itemCol, PrefixStyle.Base128); 

我的最終目標是序列化ItemTransaction,但我有IItemCollection陷入僵局。

Item和它的派生類型可以被[de]序列化,沒有問題,參見[1],但反序列化一個IItemCollection失敗(序列化作品)。 ItemCollection具有ItemExpression屬性,並且在反序列化protobuf時無法創建抽象類。這對我有意義,但我不知道如何通過它。

ItemExpression<T> : ItemExpression, IItemExpression 
ItemExpression : Expression 

ItemExpression是抽象的表達是

我如何得到這個正常工作?

此外,我擔心ItemTransaction會失敗,因爲IItemCollections在編譯時將會不同且未知(ItemTransaction將具有FooCollection,BarCollection,FlimCollection,FlamCollection等)。

我錯過了什麼(馬克)?

[1] protobuf-net [de]serializing across assembly boundaries

+0

有關信息,爲「v2」添加並傳遞的特定測試;我沒有碰過(缺少)帶有長度前綴的代碼,但是到了那裏:http://code.google.com/p/protobuf-net/source/browse/trunk/protobuf-net.unittest/Meta/ AbstractListsWithInheritance.cs – 2010-04-23 07:06:43

回答

1

我不是整個方案的完全清楚;但是Merge可以用來傳遞一個具體項目(在你想自己創建一個空的具體實例並讓protobuf-net填充屬性的情況下)。

如果ItemExpression裝飾有[ProtoInclude(...)]的預期ItemExpression<T>應該允許反序列化 - 因爲它從來沒有發現它需要創建一個抽象類型都一樣長的支持!另請參閱my answer here,其中顯示正在使用中。

如果你可以提供一個我可以用來重現問題的例子,我應該能夠提供更多的信息。


基於一些關閉論壇的例子,我想我已經得出結論,這是支持,但:

  • 如果你只是使用Deserialize...,最外層IList<T>衍生將由創建默認爲List<T>;你能解決這個問題,通過使用Merge代替,傳遞要填寫您所選擇的具體列表實例
  • 所有的ItemFooBar應標記爲合同類型,並ItemFoo之間適當的繼承標誌,並ItemBar在「V2」
  • (即將)有更多的控制來管理具體列表類型(和項目類型無類型列表)
  • 那裏似乎是相關列出反序列化毛刺,其中規定的項目類型不是根類型。這看起來已經在「v2」中自動修復,但我需要追逐它(這不幸地觸及包裝「WithLengthPrefix」/列表最外面的方法,我仍在工作)
  • 在「v2」你如果你喜歡,可以做整件事而不需要屬性(雖然它仍然需要被告知如何在某個時刻)

但是,它應該工作。我通過電子郵件向您發送了一個樣本,並打算整理上述最外面的方法。

+0

@tsupe - 「錯誤320」,「您爲文件下載提供的密鑰無效。」;你可以嘗試直接給我發電子郵件(見我的個人資料頁面) – 2010-04-22 03:41:24

+0

謝謝,馬克。我通過電子郵件發送了你。 – tsupe 2010-04-22 13:18:19

+0

根據我們的電子郵件和我的調查,protobuf-net v1目前無法滿足我們的需求,目前的時間表和情況不允許我們使用非生產代碼。感謝您的幫助。 – tsupe 2010-07-16 14:38:32