【问题标题】:SignalR not serializing enum values on custom typeSignalR 没有序列化自定义类型的枚举值
【发布时间】:2024-01-05 07:35:01
【问题描述】:

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

Clients.All.updateData(data);

调用并且 DTO(数据)一直具有正确的枚举值。但是,在从服务器接收调用的函数的位置,在客户端设置一个断点,DTO 的两个枚举都有不正确的 (0) 值。我已经在网上搜索了 SignalR 序列化枚举值的任何可能问题,但我没有遇到任何问题。有什么我想念的吗?提前致谢。

丹尼斯

【问题讨论】:

    标签: c# asp.net .net enums signalr


    【解决方案1】:

    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 configuration

    【讨论】:

    • 从 .Net Core 3.x 开始应该更新为PayloadSerializerOptions.Converters.Add(new JsonStringEnumConverter())
    • 嗨@Ramūnas - 喜欢这样吗?请参阅更新的答案。恕我直言,我们 * 的用户应该编辑答案,这样我们就不必通读 cmets 来让事情正常进行。
    • using语句呢?可能只适用于 Core 3 之前 ?
    • 确实,现在是using System.Text.Json.Serialization
    【解决方案2】:

    你说你在网上查了所有东西,但我仍然希望这个link 有用。

    只需调整您的 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();
        }
    }
    

    【讨论】:

      【解决方案3】:

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

      丹尼斯

      【讨论】: