其他分享
首页 > 其他分享> > Json.NET反序列化接口实现

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的任何程序集.

您可以通过以下两种方式之一解决此问题:

>为可序列化类型定义通用程序集,并从客户端和服务器两者中引用它.
>在客户端和服务器中分别定义类型,并通过提供自定义SerializationBinderJsonSerializerSettings.Binder来自定义Json.NET的类型解析,您可以在其中实现自己的逻辑.

标签:json-deserialization,json-net,interface,json,c
来源: https://codeday.me/bug/20191121/2054721.html