我的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>();
}
}正如您所看到的,它非常简单。我也没有用任何属性或任何特殊的东西来装饰我的类,以使它们可序列化。除了多态问题之外,一切似乎都在正常运行。
那么,如何才能正确地反序列化我的多态类型呢?
谢谢。
发布于 2013-08-04 22:54:17
您需要打开类型提示。以下是示例代码(这与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始终尝试找出数组/列表中每个元素的类型。如果你想让它只适用于单变量,那么你需要在适当的代码上进行修改(还没有尝试过)。
https://stackoverflow.com/questions/16904675
复制相似问题