2

XmlSerialization 属性で装飾された POCO との間で Json を読み書きする必要があります。この POCO は XSD から生成されています。ポリモーフィズム、継承、オブジェクト、オブジェクトの配列、および抽象クラスの配列を広範に使用します。私はすでに非常に有望に見えるJsonFx V2を試しましたが、残念ながらこれはうまく機能しておらず、このオープン ソース プロジェクトでは数年間ほとんど活動がありません。

どんな助けでも感謝します。

更新 1 : 私の知る限り、Json.NET は XmlSerialization 属性を処理する方法を知りません。

更新 2 : ServiceStack V3 は機能しているようですが、少なくとも 1 つの問題があります。

プロパティが object 型の場合は _type メンバーが追加されますが、これで問題ありません。しかし、オブジェクトの配列にはそのような情報はありません。

次の c# クラスを検討してください。

[System.Xml.Serialization.XmlIncludeAttribute(typeof(adxppostalCode))]
public partial class ADXP : ST
{
  ...
}

[System.Xml.Serialization.XmlTypeAttribute(TypeName = "adxp.postalCode"]
public partial class adxppostalCode : ADXP
{
}

オブジェクトの配列 (object[]) に adxppostalCode のインスタンスが含まれている場合、シリアル化時に Json に型情報が格納されません。その結果、adxppostalCode のインスタンスではなく、ADXP クラスのインスタンスがデシリアライズ時に配列に追加されます。

これが構成の問題にすぎないことを願っています。この動作以外はうまく機能しているためです。

Udapte 3 : さらにテストした結果、Json.NET (少なくともバージョン 7.0.1 Beta 3) は属性をサポートし、オブジェクトの配列の正しい型情報を出力するようです (名前空間とライブラリ名は削除されました)。

"Items": [
              {
                "$type": "adxppostalCode, ....",
                "mediaType": "text/plain",
                "compressionSpecified": false,
                "integrityCheckAlgorithm": 0,
                "representation": 1,
                "Text": [
                  "69110"
                ]
              }
            ]

抽象クラスの配列の場合、正しい型が出力に書き込まれます。デシリアライゼーションでは、抽象である基本型のインスタンスを作成しようとしますが、失敗します。例えば ​​:

Jsonフラグメント:

"Items": [
          {
            "$type": "IVXB_TS, ...",
            "inclusive": true,
            "value": "20091231"
          }
        ]

タイプ QTY のインスタンスを作成できませんでした。型はインターフェイスまたは抽象クラスであり、インスタンス化できません。

クラス階層 :

[System.Xml.Serialization.XmlIncludeAttribute(typeof(IVXB_TS))]
public abstract partial class ANY : object, System.ComponentModel.INotifyPropertyChanged
{
}

[System.Xml.Serialization.XmlIncludeAttribute(typeof(IVXB_TS))]
public abstract partial class QTY : ANY
{
}

[System.Xml.Serialization.XmlIncludeAttribute(typeof(IVXB_TS))]
public partial class TS : QTY
{
}

public partial class IVXB_TS : TS
{
}

抽象クラスの配列:

[System.Xml.Serialization.XmlElementAttribute("high", typeof(IVXB_TS))]
[System.Xml.Serialization.XmlElementAttribute("low", typeof(IVXB_TS))]
public QTY[] Items
4

1 に答える 1