Serialization 如何在JsonFX中反序列化多态集合?
我的JsonFX序列化代码可以工作,但是我正在序列化的对象包含一个多态实体列表,它们都被反序列化为它们的基类型,而不是它们的实际类型 这是我的序列化代码:Serialization 如何在JsonFX中反序列化多态集合?,serialization,polymorphism,jsonfx,Serialization,Polymorphism,Jsonfx,我的JsonFX序列化代码可以工作,但是我正在序列化的对象包含一个多态实体列表,它们都被反序列化为它们的基类型,而不是它们的实际类型 这是我的序列化代码: public static string Serialize(System.Object obj) { StringBuilder builder = new StringBuilder(); using (TextWriter textWriter = new StringWriter(builder)) {
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>();
}
}
公共静态字符串序列化(System.Object obj)
{
StringBuilder=新的StringBuilder();
使用(TextWriter TextWriter=新的StringWriter(生成器))
{
JsonWriter=新的JsonWriter(textWriter);
writer.Write(obj);
返回builder.ToString();
}
}
公共静态T反序列化(字符串json)
{
使用(TextReader TextReader=newStringReader(json))
{
var jsonReader=新的jsonReader(textReader);
返回jsonReader.Deserialize();
}
}
正如你所看到的,这很简单。我也没有用任何属性或任何特殊的东西来装饰我的类,使它们可以序列化。除了多态性问题,这一切似乎都正常工作
那么,我怎样才能让我的多态类型正确地反序列化呢
谢谢。您需要打开类型提示。下面是示例代码(这与JSONFXV1.4相关,可能与您的版本一起使用,也可能与您的版本不一起使用): 这将向JSON字符串中添加额外数据,如下所示:
"__type": "MyNamespace.MyClass, MyAssembly",
这意味着它会根据类名找出它的派生类型。如果更改类名或名称空间名,它将不再起作用。更糟糕的是,您不能再从旧的JSON文本数据反序列化,除非您批量替换所有出现的旧类名并用新类名替换它
所以你得小心点
编辑:忘了提到你必须编辑JsonFx的源代码才能工作。
在JsonReader.cs中,找到ReadArray方法:
更改:
object value = this.Read(arrayItemType, isArrayTypeAHint);
致:
这将确保JsonFx始终尝试找出数组/列表中每个元素的类型。如果您希望此操作仅适用于单个变量,那么您需要对相应的代码进行更改(尚未尝试过)。您需要打开类型提示。下面是示例代码(这与JSONFXV1.4相关,可能与您的版本一起使用,也可能与您的版本不一起使用): 这将向JSON字符串中添加额外数据,如下所示:
"__type": "MyNamespace.MyClass, MyAssembly",
这意味着它会根据类名找出它的派生类型。如果更改类名或名称空间名,它将不再起作用。更糟糕的是,您不能再从旧的JSON文本数据反序列化,除非您批量替换所有出现的旧类名并用新类名替换它
所以你得小心点
编辑:忘了提到你必须编辑JsonFx的源代码才能工作。
在JsonReader.cs中,找到ReadArray方法:
更改:
object value = this.Read(arrayItemType, isArrayTypeAHint);
致:
这将确保JsonFx始终尝试找出数组/列表中每个元素的类型。如果您想让它只适用于单个变量,那么您需要对相应的代码进行更改(没有尝试过)。我只是想知道JSONFX是什么?我只是想知道JSONFX是什么?