【发布时间】:2016-01-19 23:47:43
【问题描述】:
我们遇到这样一种情况,通过 json.net 进行序列化和反序列化的字段是我们其中一个对象的绑定列表属性。当试图反序列化这个字段时,我们得到一个异常:
Newtonsoft.Json.dll 中出现“Newtonsoft.Json.JsonSerializationException”类型的未处理异常
附加信息:JSON 'WpfApplication1.Wrapper
1[[System.ComponentModel.BindingList1[[System.String, mscorlib]], System]], WpfApplication1'中指定的错误解析类型。路径“Potato.$type”,第 4 行,位置 131。
为了重现,我创建了一个小样本:
public class ClassToSerialize
{
public Wrapper<BindingList<string>> Potato { get; set; }
}
public class Wrapper<T>
{
public Wrapper()
{
}
public Wrapper(T item)
{
Value = item;
}
#region Properties
[JsonProperty]
public T Value { get; set; }
#endregion
}
测试是:
var objectToSerialize = new ClassToSerialize
{
Potato = new Wrapper<BindingList<string>>(new BindingList<string>
{
"tomato",
"basil"
})
};
string serializedPotato = JsonSerializer<ClassToSerialize>.Serialize(objectToSerialize, true);
ClassToSerialize deserializedPotato = JsonSerializer<ClassToSerialize>.Deserialize(serializedPotato);
序列化代码在哪里:
public class JsonSerializer<T> where T : class
{
public static string Serialize(T item, bool isComplexType = false)
{
if (isComplexType)
{
string serializedJson = JsonConvert.SerializeObject(item, Formatting.Indented, new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Objects,
TypeNameAssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple
});
return serializedJson;
}
return JsonConvert.SerializeObject(item);
}
public static T Deserialize(string serializedItem)
{
var deserializedObject = JsonConvert.DeserializeObject<T>(serializedItem, new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Objects
});
return deserializedObject;
}
}
错误发生在这里:ClassToSerialize deserializedPotato = JsonSerializer<ClassToSerialize>.Deserialize(serializedPotato); 但如果我将底层集合的类型从BindingList<T> 更改为List<T>,一切正常。
有谁知道这里的问题是什么以及如何解决它?
请注意,我已经测试了一个未包装的 BindingList<>(即未包装在另一种类型中)并且效果很好。
非常感谢,
【问题讨论】:
-
System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple似乎有问题。如果我将其更改为FormatterAssemblyStyle.Full,问题就会消失。使用简单类型名称,在DefaultSerializationBinder.GetTypeFromTypeNameKey()内调用Type.GetType()会失败。不知道为什么;也许你应该report an issue? -
@dbc 谢谢。这解决了这个问题,但它略低于最佳状态。我会按照你的建议报告这个问题。非常感谢你,如果你写你的评论作为答案,我很乐意接受。