0

私の JsonFX シリアライゼーション コードは機能しますが、シリアライズしているオブジェクトにはポリモーフィック エンティティのリストが含まれており、それらはすべて実際の型ではなく基本型として逆シリアル化されています。

ここに私のシリアライゼーションコードがあります:

public static string Serialize(System.Object obj)
{
    StringBuilder builder = new StringBuilder();
    using (TextWriter textWriter = new StringWriter(builder))
    {
        JsonWriter writer = new JsonWriter(textWriter);
        writer.Write(obj);

        return builder.ToString();
    }
}

public static T Deserialize<T>(string json)
{
    using (TextReader textReader = new StringReader(json))
    {
        var jsonReader = new JsonReader(textReader);
        return jsonReader.Deserialize<T>();
    }
}

ご覧のとおり、非常に簡単です。また、クラスをシリアライズ可能にするための属性や特別なものでクラスを装飾していません。ポリモーフィックの問題を除けば、すべてが適切に機能しているように見えます。

では、ポリモーフィック型を適切に逆シリアル化するにはどうすればよいでしょうか?

ありがとう。

4

1 に答える 1

3

型ヒントを有効にする必要があります。コード例を次に示します (これは JsonFx v1.4 に関連しており、お使いのバージョンで動作する場合と動作しない場合があります)。

    StringBuilder result = new StringBuilder(string.Empty);

    JsonWriterSettings settings = JsonDataWriter.CreateSettings(true);
    settings.TypeHintName = "__type";

    JsonWriter writer = new JsonWriter(result, settings);

    writer.Write(obj);

    return result.ToString();

これにより、次のような追加データが JSON 文字列に追加されます。

"__type": "MyNamespace.MyClass, MyAssembly",

つまり、クラス名に基づいて派生型を見つけます。クラス名または名前空間名を変更すると、機能しなくなります。さらに悪いことに、古いクラス名をすべて一括置換して新しいクラス名に置き換えない限り、古い JSON テキスト データから逆シリアル化することはできません。

そのため、注意が必要です。

編集:これを機能させるには、JsonFx のソース コードを編集する必要があることを忘れていました。JsonReader.cs で、ReadArray メソッドを見つけます。

変化する:

object value = this.Read(arrayItemType, isArrayTypeAHint);

に:

object value = this.Read(null, false);

これにより、JsonFx は常に配列/リスト内の各要素の型を把握しようとします。これを単一の変数だけで機能させたい場合は、適切なコードを変更する必要があります (まだ試していません)。

于 2013-08-04T14:54:17.103 に答える