2015-09-29 68 views
0

我想使用SnakeYaml在服務器端反序列化,將嵌套的Dictionary屬性從C#(YamlDotNet)序列化爲Java。奇怪的是這是工作的罰款財產形式:如何使用YamlDotNet標記中的命名空間和類名稱

public IDictionary<InstrumentId, BidAsk> InstrumentBidAsk { get; private set; } 

但另一個對象時,有嵌套了一層額外的:

public IDictionary<ClearingHouse, IDictionary<InstrumentId, BidAsk>> InstrumentBidAsk { get; private set; } 

類InstrumentId不再序列化到一個對象。 Intead創建了一個LinkedHashMap。

要解決這個問題,我想也許在YamlDotNet下列選項可以在串行器使用:

Serializer(SerializationOptions.Roundtrip, namingConvention); 

這則包括的類型,我希望能在標記的Java端使用信息映射來創建適當的對象,而不是獲取LinkedHashMap。

時生成不僅包括命名空間和類名的標籤,同時也對assembley的所有信息,如版本cutlture,公鑰令牌等

例如,從Java到C#以下標記可能會創建:

!!project.package.bidask.InstrumentId 

不過從C#與Java創建如下:

!Project.Package.Configuration.InstrumentId,%Project.DataModel,%20Version=1.0.0.0,%20Culture=neutral,%20PublicKeyToken=null 

有沒有辦法展現簡潔的標籤映射?

從Java到C#頂層YAML給人鍵和值,但並沒有提及的HashMap的:

CME: ? !!project.package.bidask.InstrumentId [fieldNames] : !!project.package.bidask.BidAsk [fieldNames] 

從C#對詞典和通用類型的Java全信息給出:

CME: !System.Collections.Generic.Dictionary%602[[Project.DataModel.Configuration.InstrumentId,%20Project.DataModel,%20Version=1.0.0.0,%20Culture=neutral,%20PublicKeyToken=null],[Project.DataModel.Configuration.BidAskSize,%20Project.DataModel,%20Version=1.0.0.0,%20Culture=neutral,%20PublicKeyToken=null]],%20mscorlib,%20Version=4.0.0.0,%20Culture=neutral,%20PublicKeyToken=b77a5c561934e089 &o0 !Project.DataModel.Configuration.InstrumentId,%20Project.DataModel,%20Version=1.0.0.0,%20Culture=neutral,%20PublicKeyToken=null [fieldNames]: !Project.DataModel.Configuration.BidAskSize,%20Project.DataModel,%20Version=1.0.0.0,%20Culture=neutral,%20PublicKeyToken=null [fieldNames] 

有人可以建議如何以更簡潔的方式像SnakeYaml序列化,因爲這將更容易確定在Java端適當的標籤映射?

特別是,如果我不認爲這是必需的,那麼不需要關於Dictionary的信息會很有用--YAML語法應該覆蓋關鍵值關係。

+0

沒有Seri​​alizationOptions.Roundtrip,我可以看到從C#發送到Java和非常類似的YAML但沒有額外的層的YAML之間唯一的區別是符號&o0,&o1,&o2等。如果有方法切換此關閉,也許它會爲InstrumentId調用合適的構造函數,而不是保留LinkedHashMap。 – Chill

回答

0

我想有一個很好的方法可以使用標記映射來解決這個問題,但最後我通過收集代碼並在LinkedHashMap中創建了適當的對象來添加一個修補程序。

相關問題