Json.NET反序列化接口实现
作者:互联网
我正在尝试使用Json.NET来序列化通过HTTP请求进行传输的类.这是一个共享一些公共类文件的客户端服务器测试程序.这些文件是一个接口(ITestCase)和该接口的实现(TestPicture,TestVideo).
在同一应用程序中,下面的testCase序列化和反序列化工作正常,大概是因为Json.NET代码全部包含在一个程序集中.当我序列化testCase时,将其发送到服务器,然后尝试反序列化,我得到了错误
“在JSON’com.test.testcases.TestPicture,Graphics Tester’中指定的错误解决类型.路径’$type’,第2行,位置61”
带有消息的JsonSerializationException类型的内部异常
“无法加载程序集’Graphics Tester’.”
在Json.NET documentation中,当生成Json时,$type值为“ $type”:“ Newtonsoft.Json.Samples.Stockholder,Newtonsoft.Json.Tests”.第二个参数似乎按名称空间而不是项目名称(即Graphics Tester)引用相关类,因为它发生在我的实例中.
鉴于两个项目共享必需的类,并且文件位于同一名称空间中,为什么Json.NET在寻找程序集而不是类本身?
下面是我的代码的框架;细节被省略,因为它们不能解决问题.显示的是接口以及该接口的两个实现.还显示了序列化和反序列化操作以及生成的Json.
ITestCase testCase = new TestPicture("test.jpg")
string json = JsonConvert.SerializeObject(testCase, Formatting.Indented, new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Objects,
});
ITestCase instance = JsonConvert.DeserializeObject<ITestCase>(json, new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Objects,
});
//value in variable json after serialisation
//{
// "$type": "com.test.testcases.TestPicture, Graphics Tester",
// "filename": "test.jpg",
// "testPoints": null
//}
单个类文件:
namespace com.test.testcases
{
interface ITestCase
{
void Run();
bool Verify();
}
}
namespace com.test.testcases
{
class TestPicture : ITestCase {}
}
namespace com.test.testcases
{
class TestVideo : ITestCase {}
}
我的解决方案:
存在比我预期更简单的解决方案.这不是最佳选择,但肯定可以.我将其更多地归类为解决方法或黑客.通过更改项目属性并在两个项目中将程序集名称设置为相同,它将找到项目中已包含的类,从而创建由Json字符串指定的对象.
解决方法:
$type对完全限定的类型名称进行编码,如果客户端和服务器没有使用相同的项目来定义这些类型(即,如果每个都由自己定义类型而不是引用通用程序集),则它们在客户端和服务器之间将有所不同.
在您的情况下,在客户端中,全限定名是com.test.testcases.TestPicture,Graphics Tester,但是当它到达服务器时,服务器找不到名为Graphics Tester的任何程序集.
您可以通过以下两种方式之一解决此问题:
>为可序列化类型定义通用程序集,并从客户端和服务器两者中引用它.
>在客户端和服务器中分别定义类型,并通过提供自定义SerializationBinder到JsonSerializerSettings.Binder来自定义Json.NET的类型解析,您可以在其中实现自己的逻辑.
标签:json-deserialization,json-net,interface,json,c 来源: https://codeday.me/bug/20191121/2054721.html