我正在尝试使用 Json.NET 对一个类进行序列化,以便通过http请求进行传输。这是一个客户端服务器测试程序,共享一些常见的类文件。这些文件包括接口(
鉴于两个项目都共享所需的类,并且文件位于同一个命名空间中,为什么Json.NET要查找程序集而不是类本身?
以下是我的代码框架;详细信息被省略,因为它们对问题没有帮助。显示的是接口以及该接口的两个实现。还显示了序列化和反序列化操作以及生成的Json。
ITestCase
)和该接口的实现(TestPicture
、TestVideo
)。
在同一应用程序中对 testCase
进行序列化和反序列化工作正常,可能是因为 Json.NET 代码都包含在一个程序集中。但当我对 testCase
进行序列化、发送到服务器,然后尝试进行反序列化时,会出现以下错误:
"Error resolving type specified in JSON 'com.test.testcases.TestPicture, Graphics Tester'. Path '$type', line 2, position 61"
并附带一个类型为 JsonSerializationException 的内部异常消息:
"Could not load assembly 'Graphics Tester'."
"$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 {}
}
我的解决方案:
比我预期的要简单的解决方案存在。它并不是最优的,但肯定可行。我更倾向于将其归类为一种变通方法或者hack。通过修改项目属性并将程序集名称设置为两个项目中相同的名称,它将找到已经包含在项目中的类,从而创建由Json字符串指定的对象。
SerializationBinder
,而不是更改程序集名称。编写一个SerializationBinder
来仅基于类型名称查找类型(例如,“在当前程序集中查找具有此名称的类型”)相对容易,它不需要另一个二进制文件,并且比更改一个项目的名称以匹配另一个项目更少地被视为一种hack。 - Avish