SnakeYaml を使用して C# (YamlDotNet) から Java にネストされた Dictionary プロパティを持つオブジェクトをシリアル化し、サーバー側で逆シリアル化しようとしています。奇妙なことに、これは次の形式のプロパティでうまく機能していました。
public IDictionary<InstrumentId, BidAsk> InstrumentBidAsk { get; private set; }
ただし、ネストの追加レイヤーがある場合の別のオブジェクトの場合:
public IDictionary<ClearingHouse, IDictionary<InstrumentId, BidAsk>> InstrumentBidAsk { get; private set; }
クラス InstrumentId はオブジェクトにシリアル化されなくなりました。代わりに、LinkedHashMap が作成されます。
この問題を解決するには、シリアライザーで YamlDotNet の次のオプションを使用できるのではないかと考えました。
Serializer(SerializationOptions.Roundtrip, namingConvention);
これには、タイプに関する情報が含まれます。これは、LinkedHashMap を取得するのではなく、適切なオブジェクトを作成するためにタグ マッピングで Java 側で使用することを望んでいました。
作成されるタグには、名前空間とクラス名だけでなく、バージョンの文化、公開鍵トークンなど、アセンブリに関するすべての情報も含まれます。
たとえば、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 のようなより簡潔な方法でシリアル化する方法を誰かが提案できますか?
特に、これは必須ではないと思うので、Dictionary に関する情報を持たない方が便利です。YAML 構文はキーと値の関係をカバーする必要があります。