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

时间:2016-07-20 15:31:12

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

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

Clients.All.updateData(data);

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

丹尼斯

4 个答案:

答案 0 :(得分:5)

你说你在网上检查过所有内容,但我仍然希望这个link可能有用。

只需调整您的启动类:

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();
    }
}

答案 1 :(得分:0)

如果您使用JSON作为数据传输,那么本文可能有助于http://serena-yeoh.blogspot.co.uk/2014/04/serializing-enums-in-aspnet-signalr.html

答案 2 :(得分:0)

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

丹尼斯

答案 3 :(得分:0)

对于ASP.NET Core

using Newtonsoft.Json.Converters;

services.AddSignalR()
    .AddJsonProtocol(options =>
    {
        options.PayloadSerializerSettings.Converters.Add(new StringEnumConverter());
    });

其他阅读:ASP.NET Core SignalR configuration