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