首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在JsonFX中反序列化多态集合?

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

Stack Overflow用户
提问于 2013-06-04 03:47:25
回答 1查看 1.5K关注 0票数 0

我的JsonFX序列化代码可以工作,但是我序列化的对象包含一个多态实体列表,并且它们都被反序列化为它们的基类型,而不是它们的实际类型。

下面是我的序列化代码:

代码语言:javascript
复制
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>();
    }
}

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

那么,如何才能正确地反序列化我的多态类型呢?

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2013-08-04 22:54:17

您需要打开类型提示。以下是示例代码(这与JsonFx v1.4相关,可能适用于您的版本,也可能不适用于您的版本):

代码语言:javascript
复制
    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字符串添加额外的数据,如下所示:

代码语言:javascript
复制
"__type": "MyNamespace.MyClass, MyAssembly",

这意味着它会根据类名找出它是什么派生类型。如果更改类名或命名空间名称,它将不再起作用。更糟糕的是,您不能再从旧的JSON文本数据反序列化了,除非您批量替换所有出现的旧类名并将其替换为新的类名。

所以你必须小心使用它。

编辑:忘记提到,您必须编辑JsonFx的源代码才能使其正常工作。在JsonReader.cs中,找到ReadArray方法:

更改:

代码语言:javascript
复制
object value = this.Read(arrayItemType, isArrayTypeAHint);

至:

代码语言:javascript
复制
object value = this.Read(null, false);

这将确保JsonFx始终尝试找出数组/列表中每个元素的类型。如果你想让它只适用于单变量,那么你需要在适当的代码上进行修改(还没有尝试过)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16904675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档