Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Serialization 信号员:用例_Serialization_Json.net_Signalr_Deserialization - Fatal编程技术网

Serialization 信号员:用例

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

我想知道是否有一种方法可以配置signar,以便客户机在hub中使用camel case返回对象


谢谢。

像滚动一样滚动您自己的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 own
DependencyResolver

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中吗?这更麻烦,每次您要更改模型时,都必须更改那些硬编码字符串