4

Json.NET から ServiceStack.Text に切り替える過程にあり、ポリモーフィック コレクションのシリアル化に関する問題に遭遇しました。

JSON.NET では、カスタム JsonCreationConverter を作成し、Create() メソッドをオーバーライドして、作成するタイプを選択していました。

http://dotnetbyexample.blogspot.co.uk/2012/02/json-deserialization-with-jsonnet-class.html

問題のコレクションは、またはオブジェクトList<ItemBase>を含むことができるものです。FlightItemCarHireItem

これは、JSON.NET の Create() メソッドの私のバージョンです。

protected override ItemBase Create(Type objectType, JObject jsonObject)
        {
            var itemType = jsonObject["Type"].ToString();
            switch (itemType)
            {
                case "flight":
                    return new FlightItem();
                case "carhire":
                    return new CarHireItem();
                default: 
                    return null;
            }
        }

それはServiceStackで可能ですか?

ポリモーフィック コレクションの ServiceStack でのシリアライズとデシリアライズは機能しますが、JSON 出力にオブジェクト タイプを追加します。

"__type" : "TestProject.Model.FlightItem, TestProject"

これは、JSON を投稿するときに型を指定する必要があることを意味し、API 呼び出し内で .NET 型を誰にでも見えるようにすることにあまり熱心ではありません。

助言がありますか?別の方法でこれを行うことが可能である場合、いくつかの例を示してもらえますか?

4

1 に答える 1

6

まず、DTO のインターフェイスまたは抽象型は悪い考えです。

あなたは今、DTO でポリモーフィック型をサポートしようとしているが、JSON シリアライザー固有の情報を提供したくないという奇妙な立場にいますか? ポリモーフィック DTO をサポートするために特注のコードが必要な理由は、ワイヤ形式に基づいてどの具象型を使用する必要があるかを判断できないためです。そのため、ServiceStack はこの目的のために__typeプロパティを発行します。

これらのハッキングを回避し、すべての JSON シリアライザーで同様に機能させるには、ポリモーフィック型を単一の「フラット」DTO に「フラット化」し、代わりにそれをネットワーク経由で送信することをお勧めします。C# に戻ったら、コードを使用してそれを理想的な型に射影できます。

ServiceStack は、同様のことを実行できるものをいくつか提供しています。例については CustomSerializerTests をJsConfig<ItemBase>.RawDeserializeFn参照してください。役立つ可能性のあるフックもありますが、両方の具象型の完全なプロパティ リストが含まれているかどうかに依存します。JsConfig<ItemBase>.OnDeserializedFnItemBase

于 2013-01-11T18:19:06.823 に答える