【问题标题】:How to deserialize polymorphic collections in JsonFX?如何反序列化 JsonFX 中的多态集合?
【发布时间】:2013-06-03 19:47:24
【问题描述】:

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

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

那么我怎样才能让我的多态类型正确反序列化呢?

谢谢。

【问题讨论】:

标签: serialization polymorphism jsonfx


【解决方案1】:

您需要打开类型提示。这是示例代码(这与 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 将始终尝试找出数组/列表中每个元素的类型。如果您希望这仅适用于单个变量,那么您需要对适当的代码进行更改(尚未尝试过)。

【讨论】:

    猜你喜欢
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多