我正在绕过从一个普通类派生的类。我发现,尽管传递了反序列化有效数据,但集线器仍不遵守TypeNameHandling并完全忽略了JSON的$ type。无论我尝试什么,它都会反序列化为基类。
我去了一个事件,拿走了我发送到集线器的JSON,将它作为字符串粘贴到集线器代码中,然后使用JsonConvert.Deserialize查看会发生什么并将其正确反序列化到我的派生对象。
在我的创业公司中,我有
JsonConvert.DefaultSettings = () => new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Auto
};
我不确定是否真的在使用它,所以我创建了一个测试JSON转换器,并在CanRead属性(我返回了一个静态false)上进行了调试。受到打击。这也使我的字符串反序列化工作。
那么集线器在做什么,除了集线器之外,其他所有功能似乎都能正常工作?
答案 0 :(得分:1)
尽管传递反序列化有效数据,但集线器不遵守TypeNameHandling并完全忽略JSON的$ type。无论我尝试什么,它都会反序列化为基类。
我使用以下代码段进行了测试,这些代码段对我有用,您可以参考它。
在启动中:
services.AddSignalR().AddJsonProtocol(options => {
options.PayloadSerializerSettings = new Newtonsoft.Json.JsonSerializerSettings
{
TypeNameHandling = Newtonsoft.Json.TypeNameHandling.Auto
};
});
集线器方法:
public async Task SendMessage1(Business mes)
{
//code logic here
//...
}
类:
public abstract class Business
{
public string Name { get; set; }
}
public class Hotel : Business
{
public int Stars { get; set; }
}
在客户端上,将以下JSON数据发送到上述中心方法:
var ht = { "$type": "MyNamespaceHere.Hotel, NotesRTMSignalR", "Stars": 4, "Name": "Hudson Hotel" };
测试结果: