SignalR未序列化自定义类型上的枚举值
本文关键字:枚举 类型 序列化 自定义 SignalR | 更新日期: 2023-09-27 17:57:48
我有一个自托管的SignalR服务器,它将数据传递给.NET SignalR客户端。本质上,它是对自定义类型进行连续或按需更新。当我想触发更新时,我会创建一个数据传输对象,加载要发送的数据,并通过SignalR发送。客户端捕获更新并显示新值(我有一个WPF应用程序和一个Console应用程序,它们基本上都做相同的事情——WPF应用只是做得"漂亮"一点)。对于我的DTO上的大多数属性,一切都很好。但是有两个属性是枚举值,无论我在服务器端将其设置为什么,客户端都会看到它们作为枚举的0值(在我的情况下为"未知")。在服务器端,我一直追踪到
Clients.All.updateData(data);
调用,并且DTO(数据)一直具有正确的枚举值。但是,如果在客户端的接收服务器调用的函数的点上放置断点,则DTO的两个枚举值都不正确(0)。我已经在网上搜索了SignalR序列化枚举值的任何可能的问题,但我没有遇到任何问题。我有什么东西不见了吗?提前谢谢。
Dennis
ASP.NET Core 3.x或更高版本的
using System.Text.Json.Serialization;
services.AddSignalR()
.AddJsonProtocol(options =>
{
options.PayloadSerializerOptions.Converters
.Add(new JsonStringEnumConverter());
});
ASP.NET Core 2.2或更低版本的
using Newtonsoft.Json.Converters;
services.AddSignalR()
.AddJsonProtocol(options =>
{
options.PayloadSerializerSettings.Converters
.Add(new StringEnumConverter());
});
附加阅读:ASP.NET Core SignalR配置
你说你在网上检查了所有内容,但我仍然希望这个链接有用。
只需调整您的启动类:
public class Startup
{
public void Configuration(IAppBuilder app)
{
// Create JsonSerializer with StringEnumConverter.
var serializer = new JsonSerializer();
serializer.Converters.Add(new StringEnumConverter());
// Register the serializer.
GlobalHost.DependencyResolver.Register(typeof(JsonSerializer), () => serializer);
app.MapSignalR();
}
}
好吧,在经历了很多磕磕碰碰之后,我似乎需要将setter添加到DTO上的公共枚举属性中,以使它们正确地序列化(或者,更准确地说,我认为,使它们反序列化)。最初我有不可变的属性(这对我的其他基元类型的属性很好)。我尝试了很多事情——从更改属性名称(最初与枚举类型的名称相同),到更新客户端中的Newtonsoft包,再到添加Json转换器。但似乎最终成功的是在我的枚举属性中添加setter。我仍然不知道为什么会这样,也不知道是否有其他方法来解决我的问题(如果有人有任何想法,请告诉我!),但这解决了问题。感谢那些回复的人。
Dennis