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

SignalR未序列化自定义类型上的枚举值

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