Serialization 信号员:用例
我想知道是否有一种方法可以配置signar,以便客户机在hub中使用camel case返回对象Serialization 信号员:用例,serialization,json.net,signalr,deserialization,Serialization,Json.net,Signalr,Deserialization,我想知道是否有一种方法可以配置signar,以便客户机在hub中使用camel case返回对象 谢谢。像滚动一样滚动您自己的CONTRACT解析器 public class SignalRContractResolver : IContractResolver { private readonly Assembly assembly; private readonly IContractResolver camelCaseContractResolver; priva
谢谢。像滚动一样滚动您自己的CONTRACT解析器
public class SignalRContractResolver : IContractResolver
{
private readonly Assembly assembly;
private readonly IContractResolver camelCaseContractResolver;
private readonly IContractResolver defaultContractSerializer;
public SignalRContractResolver()
{
defaultContractSerializer = new DefaultContractResolver();
camelCaseContractResolver = new CamelCasePropertyNamesContractResolver();
assembly = typeof(Connection).Assembly;
}
public JsonContract ResolveContract(Type type)
{
if (type.Assembly.Equals(assembly))
{
return defaultContractSerializer.ResolveContract(type);
}
return camelCaseContractResolver.ResolveContract(type);
}
}
登记一下
var settings = new JsonSerializerSettings();
settings.ContractResolver = new SignalRContractResolver();
var serializer = JsonSerializer.Create(settings);
GlobalHost.DependencyResolver.Register(typeof (JsonSerializer), () => serializer);
如果使用自定义IoC,您可能会遇到问题,因为JsonSerializer
是一个具体类型,一些IoC(例如Ninject)将注入未绑定的具体类型。在Ninject的情况下,解决方案是向Ninject注册,而不是向Signals ownDependencyResolver
var settings = new JsonSerializerSettings();
settings.ContractResolver = new SignalRContractResolver();
var serializer = JsonSerializer.Create(settings);
kernel.Bind<JsonSerializer>().ToConstant(serializer);
var settings=newjsonserializersettings();
settings.ContractResolver=新信号ContractResolver();
var serializer=JsonSerializer.Create(设置);
kernel.Bind().ToConstant(序列化程序);
有关我的博客的更多信息:
安德斯的回答是正确的;我只是想补充一点,对于任何使用AutoFac而不是Ninject的用户,您应该在
启动中使用此注册。cs
:
var settings = new JsonSerializerSettings();
settings.ContractResolver = new SignalRContractResolver();
var serializer = JsonSerializer.Create(settings);
builder.RegisterInstance(serializer).As<JsonSerializer>();
var settings=newjsonserializersettings();
settings.ContractResolver=新信号ContractResolver();
var serializer=JsonSerializer.Create(设置);
RegisterInstance(序列化程序).As();
要与ASP.NET Core一起使用,您可以在Startup->ConfigureServices中注册JsonSerializer,如下所示:
var settings = new JsonSerializerSettings { ContractResolver = new SignalRContractResolver() };
var serializer = JsonSerializer.Create(settings);
services.AddSingleton(serializer);
如果您不想干预signarconfig或者觉得太麻烦,可以添加JsonProperty属性来指定模型序列化后的属性名称。JsonProperty来自JSON.NET,Signal使用它进行序列化
[JsonProperty("id")]
public byte Id { get; set; }
[JsonProperty("name")]
public string Name { get; set; }
为asp.net core配置信号器序列化设置的正确方法是:
// Inside your Startup.ConfigureServices
var settings = new JsonSerializerSettings
{
// ... your serialization settings
};
services.AddOptions<JsonHubProtocolOptions>()
.Configure(x => x.PayloadSerializerSettings = settings);
//在Startup.ConfigureServices中
var设置=新的JsonSerializerSettings
{
//…您的序列化设置
};
services.AddOptions()
.Configure(x=>x.PayloadSerializerSettings=设置);
您知道如何在ASP.NET 5/SignalR 3中进行相同的配置吗?GlobalHost现在已被新的依赖项注入方式所取代…很抱歉,我们还没有看到SignalR 3,我们必须确保没有可用的SignalR预发布版本?对于遇到“您使用的客户端版本与服务器不兼容。客户端版本1.5,服务器版本未定义”的任何人升级信号器时出错,请查看此答案。实际上是我的问题的原因(我使用“旧”方法添加序列化程序设置)。此注册在哪里进行?是在Startup.cs中吗?这更麻烦,每次您要更改模型时,都必须更改那些硬编码字符串