我想使用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語法應該覆蓋關鍵值關係。
沒有SerializationOptions.Roundtrip,我可以看到從C#發送到Java和非常類似的YAML但沒有額外的層的YAML之間唯一的區別是符號&o0,&o1,&o2等。如果有方法切換此關閉,也許它會爲InstrumentId調用合適的構造函數,而不是保留LinkedHashMap。 – Chill