【问题标题】:SignalR 2.0.0 beta2 IJsonSerializer extensibilitySignalR 2.0.0 beta2 IJsonSerializer 可扩展性
【发布时间】:2013-08-06 10:10:30
【问题描述】:

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

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

https://github.com/SignalR/SignalR/issues/500

但是似乎有问题。更具体地说,JsonNetSerializerIJsonSerializer 类不存在于任何 signalR 程序集中。在这方面,最新版本的 signalR 是否发生了任何变化?

【问题讨论】:

    标签: json serialization signalr


    【解决方案1】:

    只是为了澄清一点,从 SignalR 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); 
      }
    

    【讨论】:

    【解决方案2】:

    在 SignalR 2.0 中,您无法替换 JsonSerializer,不再有 IJsonSerializer 抽象。它总是 JSON.NET。

    【讨论】:

    • 那你如何覆盖合约解析器呢?我们需要我们的 json 在驼峰式案例中。
    • @davidfowl 如何将转换器添加到信号器使用的 JSON.net 格式化程序?指定 JsonConvert.DefaultSettings 不起作用
    【解决方案3】:

    这是一个使用 StructureMap 覆盖 SignalR 依赖解析器的示例。 在这个特定示例中,我将转换为 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));
        }
    }
    

    StructureMap 的设置是:

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

    【讨论】:

      猜你喜欢
      • 2013-07-31
      • 2012-07-23
      • 1970-01-01
      • 2011-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-04
      • 2018-10-16
      相关资源
      最近更新 更多