SignalR没有序列化自定义类型的枚举值

Den*_*nis 0 .net c# asp.net enums signalr

我有一个自托管的SignalR服务器将数据传递给.NET SignalR客户端.从本质上讲,它正在对自定义类型进行连续或按需更新.当我想触发更新时,我创建了一个数据传输对象,加载了要发送的数据,并通过SignalR发送.客户端捕获更新并显示新值(我有一个WPF应用程序和一个控制台应用程序,两者基本上做同样的事情 - WPF应用程序只是做了一点"更漂亮").对于我的DTO上的大多数属性,一切正常.但是有两个属性是枚举值,并且无论我在服务器端设置什么,它们总是作为枚举的0值(在我的情况下为"未知")来到客户端.在服务器端,我一直跟踪它

Clients.All.updateData(data);
Run Code Online (Sandbox Code Playgroud)

调用和DTO(数据)具有正确的枚举值,一直到该点.但是在接收来自服务器的调用的函数点处在客户端放置断点,DTO对于两个枚举都具有不正确的(0)值.我已经在线搜索SignalR序列化枚举值的任何可能问题,我没有遇到过任何问题.有什么我想念的吗?提前致谢.

丹尼斯

spo*_*ahn 18

ASP.NET Core 3.x 或更高版本

using System.Text.Json.Serialization;

services.AddSignalR()
    .AddJsonProtocol(options =>
    {
        options.PayloadSerializerOptions.Converters
           .Add(new JsonStringEnumConverter());
    });
Run Code Online (Sandbox Code Playgroud)

ASP.NET Core 2.2 或更低

using Newtonsoft.Json.Converters;

services.AddSignalR()
    .AddJsonProtocol(options =>
    {
        options.PayloadSerializerSettings.Converters
            .Add(new StringEnumConverter());
    });
Run Code Online (Sandbox Code Playgroud)

补充阅读:ASP.NET Core SignalR 配置

  • 从 .Net Core 3.x 开始,应更新为“PayloadSerializerOptions.Converters.Add(new JsonStringEnumConverter())” (3认同)
  • 事实上,现在是“使用 System.Text.Json.Serialization” (2认同)

dan*_*nny 5

你说你在网上查了一切,但我仍然希望这个链接有用.

只需调整您的Startup类:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)


Den*_*nis 2

好吧,经过多次摸索之后,我似乎需要将 setter 添加到 DTO 上的公共枚举属性中,以使它们正确序列化(或者,更准确地说,我认为,使它们反序列化)。最初我有不可变的属性(这对于我的原始类型的其他属性来说效果很好)。我尝试了很多事情 - 从更改属性名称(最初与枚举类型的名称相同),到更新客户端中的 Newtonsoft 包,再到添加 Json 转换器的东西。但看来最终成功的方法是将 setter 添加到我的枚举属性中。我仍然不知道为什么会这样,或者是否有其他方法可以解决我的问题(如果有人有任何想法,请告诉我!),但这解决了问题。感谢那些回复的人。

丹尼斯