JSON.NET使用Type参数反序列化为对象

我有以下问题,我无法解决:

我有不同的类,它们都实现了一个名为IProtocol的接口。 目前,它们被命名为SimpleProtocolParallelProtocol 。 我想坚持这些对象,所以我使用了JSON.NET,一切正常。 除非我试图反序列化它们,当我知道它们应该是什么类型时,它会完美地工作,例如:

 SimpleProtocol p = JsonConvert.DeserializeObject(myJsonData); 

但是,我现在处于这样一种情况:我想加载JSON数据并获得IProtocol ,但这是可以理解的,JSON不允许这样做; 例如,这样的东西不起作用:

 IProtocol p1 = JsonConvert.DeserializeObject(myJsonData); // does not work IProtocol p2 = (IProtocol)JsonConvert.DeserializeObject(myJsonData); // also, does not work 

所以,查找API我发现了这个方法签名:

 public static Object DeserializeObject( string value, Type type ) 

看起来就像我需要的东西,所以通过在字符串中保存类型并检索它来尝试:

 // test Type protocolType = Type.GetType("MyApp.Protocols.SimpleProtocol"); IProtocol p1 = JsonConvert.DeserializeObject(myJsonData, protocolType); 

我得到一个错误,就是不可能将Newtonsoft.Json.Linq.JObject IProtocolIProtocol 。 这很奇怪,我不知道如何解决这个问题。

在generics方法中传递Type对象是不可能的,所以我基本上被困在这里。 有没有办法解决这个问题,最好不要使用reflection? 在我看来,这是一个完全正常的用例。

我能做什么,但对我来说似乎有点“脏”,是创建一个简单的包装类,它包含一个IProtocol实例并序列化/反序列化?

看来我使用这种方法的初步方法毕竟是正确的:

 public static Object DeserializeObject( string value, Type type ) 

问题是我将我的对象类型持久化为使用MyProtocol.GetType().FullName导致一个值跟随

Type protocolType = Type.GetType(PersistedTypeString);

是一个具有null值的Type。 但是通过使用MyProtocol.GetType().AssemblyQualifiedName一切正常(ps这也包含在Type.GetType()的文档中)

这是我的代码示例:

 Type ProtocolType = Type.GetType(MetaData["ProtocolType"]); var Protocol = JsonConvert.DeserializeObject(Data["Protocol"], ProtocolType, JsonProtocolPersister.DefaultSettings); return (IProtocol)Protocol;