如何在JsonFX中反序列化多态集合?

时间:2013-06-03 19:47:25

标签: serialization polymorphism jsonfx

我的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>();
    }
}

正如你所看到的那样非常简单。我也没有用任何属性或任何特殊的东西来装饰我的类,以使它们可序列化。除了多态问题外,一切似乎都正常。

那么如何让我的多态类型正确反序列化?。

感谢。

1 个答案:

答案 0 :(得分: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始终尝试确定数组/列表中每个元素的类型。如果您希望这只适用于单个变量,那么您需要对相应的代码进行更改(尚未尝试过)。