gpt4 book ai didi

c# - Json.NET反序列化为接口(interface)实现

转载 作者:行者123 更新时间:2023-11-30 16:12:14 28 4
gpt4 key购买 nike

我正在尝试使用 Json.NET序列化一个类以通过 http 请求进行传输。这是一个共享一些通用类文件的客户端服务器测试程序。这些文件是一个接口(interface) (ITestCase) 和该接口(interface)的实现(TestPictureTestVideo)。

在同一个应用程序中序列化和反序列化下面的 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 查找程序集而不是类本身?

下面是我的代码框架;省略了细节,因为它们对解决问题没有帮助。显示的是接口(interface),以及该接口(interface)的两个实现。还显示了序列化和反序列化操作,以及生成的 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 {}
}

我的解决方案:

存在比我预期的更简单的解决方案。这不是最佳的,但它确实有效。我会将其归类为解决方法或 hack。通过更改项目属性并将程序集名称设置为在两个项目中相同,它将找到项目中已包含的类,从而创建由 Json 字符串指定的对象。

最佳答案

$type 编码完全限定的类型名称,如果客户端和服务器不使用相同的项目来定义这些类型(即,如果每个定义类型由本身而不是引用一个公共(public)程序集)。

在您的情况下,在客户端中的完全限定名称是 com.test.testcases.TestPicture, Graphics Tester,但是当它到达服务器时,服务器找不到任何名为图形测试器

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

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

关于c# - Json.NET反序列化为接口(interface)实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23232884/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com