SignalR 未序列化自定义类型的枚举值
SignalR not serializing enum values on custom type
我有一个自托管的 SignalR 服务器将数据传递给 .NET SignalR 客户端。本质上,它正在对自定义类型进行连续或按需更新。当我想触发更新时,我创建了一个数据传输对象,用要发送的数据加载它,并通过 SignalR 发送它。客户端捕获更新并显示新值(我有一个 WPF 应用程序和一个控制台应用程序,两者基本上做同样的事情 - WPF 应用程序只是做了一点 "prettier")。对于我的 DTO 上的大多数属性,一切都正常。但是有两个属性是枚举值,无论我在服务器端将其设置为什么,它们总是作为枚举的 0 值(在我的例子中为 "Unknown")传递给客户端。在服务器端,我一直追踪到
Clients.All.updateData(data);
调用和 DTO(数据)一直到那个点都有正确的枚举值。但是在客户端的断点就在从服务器接收调用的函数点,DTO 的两个枚举值都不正确 (0)。我在网上搜索了 SignalR 序列化枚举值的任何可能问题,但我没有遇到任何问题。有什么我想念的吗?提前致谢。
丹尼斯
你说你在网上查了所有的东西,但我还是希望这个link能有用。
只需调整您的启动 class:
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 上的 public 枚举属性中,以使它们序列化(或者,更准确地说,我相信,使它们反序列化)正确。最初我有不可变的属性(这对我的原始类型的其他属性很好用)。我尝试了很多事情——从更改 属性 名称(最初与枚举类型的名称相同)到更新客户端中的 Newtonsoft 包,再到添加 Json 转换器。但似乎最终成功的方法是将 setter 添加到我的枚举属性中。我仍然不知道为什么会这样,或者是否有其他方法可以解决我的问题(如果有人有任何想法,请告诉我!),但这解决了问题。感谢回复的人。
丹尼斯
ASP.NET 核心 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());
});
我有一个自托管的 SignalR 服务器将数据传递给 .NET SignalR 客户端。本质上,它正在对自定义类型进行连续或按需更新。当我想触发更新时,我创建了一个数据传输对象,用要发送的数据加载它,并通过 SignalR 发送它。客户端捕获更新并显示新值(我有一个 WPF 应用程序和一个控制台应用程序,两者基本上做同样的事情 - WPF 应用程序只是做了一点 "prettier")。对于我的 DTO 上的大多数属性,一切都正常。但是有两个属性是枚举值,无论我在服务器端将其设置为什么,它们总是作为枚举的 0 值(在我的例子中为 "Unknown")传递给客户端。在服务器端,我一直追踪到
Clients.All.updateData(data);
调用和 DTO(数据)一直到那个点都有正确的枚举值。但是在客户端的断点就在从服务器接收调用的函数点,DTO 的两个枚举值都不正确 (0)。我在网上搜索了 SignalR 序列化枚举值的任何可能问题,但我没有遇到任何问题。有什么我想念的吗?提前致谢。
丹尼斯
你说你在网上查了所有的东西,但我还是希望这个link能有用。
只需调整您的启动 class:
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 上的 public 枚举属性中,以使它们序列化(或者,更准确地说,我相信,使它们反序列化)正确。最初我有不可变的属性(这对我的原始类型的其他属性很好用)。我尝试了很多事情——从更改 属性 名称(最初与枚举类型的名称相同)到更新客户端中的 Newtonsoft 包,再到添加 Json 转换器。但似乎最终成功的方法是将 setter 添加到我的枚举属性中。我仍然不知道为什么会这样,或者是否有其他方法可以解决我的问题(如果有人有任何想法,请告诉我!),但这解决了问题。感谢回复的人。
丹尼斯
ASP.NET 核心 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());
});