0

我正在尝试使用 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。

创建的标签不仅包括命名空间和类名,还包括关于汇编的所有信息,例如版本切割、公钥令牌等。

例如,从 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 端确定适当的标记映射?

特别是,没有关于 Dictionary 的信息会很有用,因为我认为这不是必需的 - YAML 语法应该涵盖键值关系。

4

1 回答 1

0

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

于 2015-10-01T16:52:50.193 回答