c# - JSON.NET 反序列化为带有 Type 参数的对象

标签 c# types casting json.net deserialization

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

我有不同的类,它们都实现了一个名为 IProtocol 的接口(interface)。目前,它们被命名为 SimpleProtocolParallelProtocol。我想保留那些对象,所以我使用了 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 实例并序列化/反序列化它?

最佳答案

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

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;

关于c# - JSON.NET 反序列化为带有 Type 参数的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15178323/

相关文章:

c# - 如何在 C# 中更改变量类型?

java - 构造函数和不同的数据类型令人困惑

c# - ASP.NET MVC6 - 请求的资源不支持 http 方法 'GET'

c# - 如何使用 AddHours 和 AddMinutes 在 DateTime 变量中添加时间?

parsing - 为什么 Haskell 的 Prelude.read 不返回 Maybe ?

c++ - dynamic_cast 派生类型失败,为什么?

C++ 工厂和类型转换问题

c++ - 使用 strstream C++ 将数字转换为字符串并返回

c#:从可空类型分配

c# - 为什么这种泛型场景会导致 TypeLoadException?