我的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>();
}
}
正如你所看到的那样非常简单。我也没有用任何属性或任何特殊的东西来装饰我的类,以使它们可序列化。除了多态问题外,一切似乎都正常。
那么如何让我的多态类型正确反序列化?。
感谢。
答案 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始终尝试确定数组/列表中每个元素的类型。如果您希望这只适用于单个变量,那么您需要对相应的代码进行更改(尚未尝试过)。