我遇到了以下无法解决的问题:
我有不同的类,它们都实现了一个名为IProtocol
的接口。目前,这些名称为SimpleProtocol
,ParallelProtocol
。我想坚持这些对象,所以我使用JSON.NET,一切正常。除非我试图对它们进行反序列化,否则当我知道它们应该是什么类型时它会完美地工作,例如:
SimpleProtocol p = JsonConvert.DeserializeObject<SimpleProtocol>(myJsonData);
但是,我现在处于需要加载JSON数据并返回IProtocol
的情况,但可以理解的是,JSON不允许这样做;例如,类似这样的事情不工作:
IProtocol p1 = JsonConvert.DeserializeObject<IProtocol>(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
转换为IProtocol
。这很奇怪,我不知道如何解决这个问题。
在通用方法中传递Type对象是不可能的,所以我基本上被困在这里。有没有办法解决这个问题,最好不要使用反射?在我看来,这是一个非常正常的用例。
我能做什么,但对我来说似乎有点'肮脏',是创建一个简单的包装类,它包含一个IProtocol实例并序列化/反序列化?
答案 0 :(得分:31)
毕竟使用这种方法的初步方法似乎是正确的:
public static Object DeserializeObject(
string value,
Type type
)
问题在于我将我的对象类型保持为使用MyProtocol.GetType().FullName
,从而产生了一个值
Type protocolType = Type.GetType(PersistedTypeString);
是具有null
值的类型。但是,使用MyProtocol.GetType().AssemblyQualifiedName
一切正常(p.s.这也包含在Type.GetType()的文档中)
这是我的代码示例:
Type ProtocolType = Type.GetType(MetaData["ProtocolType"]);
var Protocol = JsonConvert.DeserializeObject(Data["Protocol"],
ProtocolType,
JsonProtocolPersister.DefaultSettings);
return (IProtocol)Protocol;