C# 信号机和转换器
我想按说明序列化派生类型,但对于信号器 我想实现从JsonConverter派生的自定义转换器 我把它添加到信号器中如下C# 信号机和转换器,c#,signalr,C#,Signalr,我想按说明序列化派生类型,但对于信号器 我想实现从JsonConverter派生的自定义转换器 我把它添加到信号器中如下 var serializer = GlobalHost.DependencyResolver.GetService(typeof(JsonSerializer)) as JsonSerializer; var i = new CustomTypeConverter(); serializer.Converters.Add(i); GlobalHost.DependencyRe
var serializer = GlobalHost.DependencyResolver.GetService(typeof(JsonSerializer)) as JsonSerializer;
var i = new CustomTypeConverter();
serializer.Converters.Add(i);
GlobalHost.DependencyResolver.Register(typeof(JsonSerializer), () => serializer);
在public override bool CanConvert(Type objectType)
当我调试这个函数时,我看不到我认为是解决方案一部分的类型这已经让我发疯好几个小时了。多亏了halter73的评论,我在我的特殊情况下找到了解决问题的方法:我需要管道来为我创建接口实例,而这不是开箱即用的。 因此,解决方案如下:
class CustomResolver : Microsoft.AspNet.SignalR.Hubs.DefaultParameterResolver
{
public override object ResolveParameter( Microsoft.AspNet.SignalR.Hubs.ParameterDescriptor descriptor, Microsoft.AspNet.SignalR.Json.IJsonValue value )
{
if( descriptor.ParameterType.IsInterface )
{
object TargetObject = <Create the object instance here>
return value.ConvertTo( TargetObject.GetType() );
}
else
{
return value.ConvertTo( descriptor.ParameterType );
}
}
}
将此新参数解析程序注册到:
GlobalHost.DependencyResolver.Register( typeof( Microsoft.AspNet.SignalR.Hubs.IParameterResolver ), () => new CustomResolver() );
如何使用要序列化的类型?如果将其作为参数传递给客户机中心方法,则您要查找的类型可能是ClientHubinLocation。您类型的对象将位于“Args”数组中。我在trasport线上没有看到ClientHubinLocation,我看到了HubInvocation,我无法访问它,因为它是一个私有类。我还看到了ClientHubInfo,HubInvocation HubInvocation类正在被反序列化,而不是序列化。您正在尝试反序列化或序列化您的类型吗?或者两者都有?如果您仍在尝试序列化,则可能需要查找ConnectionMessage而不是ClientHubinLocation。ConnectionMessage.Value将包含您的ClientHubinLocation。我正在尝试基于客户端生成的$type属性在服务器端反序列化。遗憾的是,您当前无法通过替换/修改JsonSerializer来更改服务器端输入的反序列化方式。DependencyResolver注册了一个iPrameterResolver,负责反序列化服务器端输入。IParameterResolver由DefaultParameterResolver实现,它不使用DependencyResolver注册的JsonSerializer。谢谢你。我在服务器端使用了很多不可变类型,尽管JSON.Net很乐意对它们进行反序列化(并且让SignalR/WebAPI使用JSON.Net),但我无法让SignalR调用我的JSON.Net契约解析器。我从您的回答中看到,创建参数解析器是将代码填充到SignalR以使其正常工作的适当方法。谢谢!!:)
GlobalHost.DependencyResolver.Register( typeof( Microsoft.AspNet.SignalR.Hubs.IParameterResolver ), () => new CustomResolver() );