我尝试使用SnakeYaml将具有嵌套字典属性的对象从C#(YamlDotNet)序列化为Java,以便在服务器端进行反序列化。奇怪的是,这在以下形式的财产上运作良好:
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。
创建的标记不仅包括命名空间和类名,还包括汇编的所有信息,例如版本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,有关Dictionary和泛型类型的完整信息:
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端确定适当的标记映射吗?
特别是,没有关于词典的信息是有用的,因为我不认为这是必需的 - YAML语法应该涵盖键值关系。
答案 0 :(得分:0)
我想有一种很好的方法可以使用标记映射来解决这个问题,但最后我通过遍历集合并在我的代码中从LinkedHashMap创建了适当的对象来添加修复。