我有下面的代码是在我的API序列化支持单元测试的一部分:Json.Net序列化程序不正确地尊重TypeNameHandling属性?
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的类型“VDS.RDF.INode”没有有效的构造..
现在的问题似乎是Json.Net尝试使用ISerializable
但具体我正在反序列化的对象被键入为接口,因此它是试图实例化接口,而不是最初序列化的接口的实际实现。
因此,进一步调查,我看到Json.Net在序列化程序中提供了一个TypeNameHandling
设置,可用于包含类型名称。所以我把它设置为All
,就像你在代码片段中看到的一样,但是这似乎没有任何作用。插入类型名称的唯一类型是List<T>
类型,这对我没有任何帮助,仍然给我带来了同样令人沮丧的错误消息。
我在这里做错了什么,或者是否存在Json.Net和TypeNameHandling
设置的错误?
为了记录我使用的是最新的Json.Net释放虽然在NET 3.5的构建
THX为你的研究修复该问题一起发布这个,伙计! –
@RogerTaylor我相信这已被更新版本的Json.Net – RobV
修复。我希望如此,我目前正在尝试使用这个伟大的工具,但面对很多问题,其中一些看起来像bug。 –