【发布时间】:2011-08-03 17:28:35
【问题描述】:
我有以下代码,它是我的 API 中序列化支持单元测试的一部分:
private void TestGraphSerializationJson(IGraph g)
{
StringWriter writer = new StringWriter();
JsonSerializer serializer = new JsonSerializer();
//The following line should make the serializer output type names
//in the JSON but seems to be ignored
serializer.TypeNameHandling = TypeNameHandling.All;
serializer.Serialize(new JsonTextWriter(writer), g);
Console.WriteLine("Serialized Form:");
Console.WriteLine(writer.ToString());
Console.WriteLine();
Object h = serializer.Deserialize<Graph>(new JsonTextReader(new StringReader(writer.ToString())));// as Graph;
Console.WriteLine(h.GetType().FullName);
Assert.AreEqual(g, h, "Graphs should be equal");
}
我的 API 中的各种类都实现了 ISerializable 接口,Json.Net 非常乐意将我的类序列化为适当的 JSON。
问题是,当我尝试反序列化我的对象时,我得到一个相当史诗般的堆栈跟踪和以下错误消息:
测试方法 VDS.RDF.Test.Writing.Serialization.GraphSerializationTests.SerializationJsonGraph 抛出异常:Newtonsoft.Json.JsonSerializationException: ISerializable type 'VDS.RDF.INode' does not have a valid constructor..
现在问题似乎是 Json.Net 正在尝试使用 ISerializable 但我反序列化的特定对象被键入为接口,因此它试图实例化接口而不是该接口的实际实现最初是序列化的。
所以进一步调查我发现 Json.Net 在序列化程序上提供了一个TypeNameHandling 设置,可用于包含类型名称。因此,我将其设置为All,正如您在代码 sn-p 中看到的那样,但这似乎没有任何效果。插入类型名称的唯一类型是 List<T> 类型,这对我没有帮助,仍然给我留下同样令人沮丧的错误消息。
我在这里做错了什么还是 Json.Net 和 TypeNameHandling 设置存在错误?
为了记录,我使用的是最新的 Json.Net 版本,尽管是 .Net 3.5 版本
【问题讨论】: