Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.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
SignalR 2.0.0 beta2 ijson序列化程序扩展性_Json_Serialization_Signalr - Fatal编程技术网

SignalR 2.0.0 beta2 ijson序列化程序扩展性

SignalR 2.0.0 beta2 ijson序列化程序扩展性,json,serialization,signalr,Json,Serialization,Signalr,我想添加一些自定义序列化逻辑,以便转换后的json包含驼峰大小写属性 出于这个原因,我尝试用我在这个链接中找到的一个替换默认的IJsonSerializer: 然而,似乎有一个问题。更具体地说,JsonNetSerializer和IJsonSerializer类不存在于任何信号器组件中。在这方面,signalR的最新版本有什么变化吗?在signalR 2.0中,您不能替换JsonSerializer,没有更多的IJsonSerializer抽象。它始终是JSON.NET。只是澄清一下这一点,从

我想添加一些自定义序列化逻辑,以便转换后的json包含驼峰大小写属性

出于这个原因,我尝试用我在这个链接中找到的一个替换默认的IJsonSerializer:


然而,似乎有一个问题。更具体地说,
JsonNetSerializer
IJsonSerializer
类不存在于任何信号器组件中。在这方面,signalR的最新版本有什么变化吗?

在signalR 2.0中,您不能替换JsonSerializer,没有更多的IJsonSerializer抽象。它始终是JSON.NET。

只是澄清一下这一点,从Signaler 2开始,您不能用非JSON.NET的序列化程序替换序列化程序。但是,SinglR使用的JSON.NET序列化程序可以使用DependacyResolver创建和设置

下面是一个示例,其中创建了一个新的JsonSerializer来处理引用循环:

  protected void Application_Start()
  {
     var serializerSettings = new JsonSerializerSettings();
     serializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Serialize;
     serializerSettings.PreserveReferencesHandling = PreserveReferencesHandling.Objects;

     var serializer = JsonSerializer.Create(serializerSettings);
     GlobalHost.DependencyResolver.Register(typeof(JsonSerializer), () => serializer); 
  }

下面是一个使用StructureMap重写信号器依赖项解析器的示例。 在这个特定的示例中,我将转换为camelCase属性,并将枚举转换为字符串

启动期间:

Microsoft.AspNet.SignalR.GlobalHost.DependencyResolver = new StructureMapSignalRDependencyResolver();
下面是课程:

public class StructureMapSignalRDependencyResolver : Microsoft.AspNet.SignalR.DefaultDependencyResolver
{
    public override object GetService(Type serviceType)
    {
        object service;
        if (!serviceType.IsAbstract && !serviceType.IsInterface && serviceType.IsClass)
        {
            // Concrete type resolution
            service = StructureMap.ObjectFactory.GetInstance(serviceType);
        }
        else
        {
            // Other type resolution with base fallback
            service = StructureMap.ObjectFactory.TryGetInstance(serviceType) ?? base.GetService(serviceType);
        }

        return service;
    }

    public override IEnumerable<object> GetServices(Type serviceType)
    {
        var objects = StructureMap.ObjectFactory.GetAllInstances(serviceType).Cast<object>();
        return objects.Concat(base.GetServices(serviceType));
    }
}

那么,您如何覆盖合同解析程序?我们需要驼峰格式的json。@davidfowl如何向Signal使用的json.net格式化程序添加转换器?指定
JsonConvert.DefaultSettings
不起作用,这是一个很好的信息!但同时,信号机中糟糕的架构。。。但是,既然我没有射杀信使,那就投票吧:)这正是我要找的。这方面的信息现在看来已经过时了。这似乎是一个更现代的参考。
ObjectFactory.Configure(c =>
    {
        c.Scan(a =>
            {
                // scan the assembly that SignalR is referenced by
                a.AssemblyContainingType<AppHost>(); 
                a.WithDefaultConventions();
            });

        c.For<Newtonsoft.Json.JsonSerializer>()
         .Singleton()
         .Use(new Newtonsoft.Json.JsonSerializer 
             { 
                 ContractResolver = new SignalRContractResolver(), 
                 Converters = { new Newtonsoft.Json.Converters.StringEnumConverter() } 
             });
    });
public class SignalRContractResolver : Newtonsoft.Json.Serialization.IContractResolver
{
    private readonly Assembly _assembly;
    private readonly Newtonsoft.Json.Serialization.IContractResolver _camelCaseContractResolver;
    private readonly Newtonsoft.Json.Serialization.IContractResolver _defaultContractSerializer;

    public SignalRContractResolver()
    {
        _defaultContractSerializer = new Newtonsoft.Json.Serialization.DefaultContractResolver();
        _camelCaseContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver();
        _assembly = typeof(Connection).Assembly;
    }

    public Newtonsoft.Json.Serialization.JsonContract ResolveContract(Type type)
    {
        if (type.Assembly.Equals(_assembly))
        {
            return _defaultContractSerializer.ResolveContract(type);
        }

        return _camelCaseContractResolver.ResolveContract(type);
    }
}