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