如何在YamlDotNet的标记中使用名称空间和类名

时间:2015-09-29 16:59:23

标签: yamldotnet

我尝试使用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语法应该涵盖键值关系。

1 个答案:

答案 0 :(得分:0)

我想有一种很好的方法可以使用标记映射来解决这个问题,但最后我通过遍历集合并在我的代码中从LinkedHashMap创建了适当的对象来添加修复。