问题描述
我需要来自SignalR开发人员的一些指导,调整集线器方法的参数序列化的最佳方式是什么。
我开始将我的项目从WCF轮询双工(Silverlight5-ASP.NET4.5)迁移到SignalR(1.1.2)。消息(数据协定)基于接口是多态的。(就像iMessage、MessageA:iMessage等--实际上有一个由类实现的接口层次结构,但对于这个问题来说意义不大)。 (我知道多态对象对客户端不好,但客户端会将其作为JSON处理,如果是.NET/Silverlight,则只在服务器端或客户端映射到对象)
在集线器上,我定义的方法如下:
public void SendMessage(IMessage data) { .. }
我创建了自定义JsonConverter,并验证了可以使用Json.NET序列化/反序列化消息。然后,我用正确的设置替换了DependencyResolver中的JsonNetSerializer。同样,在Silverlight客户端也是如此。到目前为止还不错。
但是,当我将消息从客户端发送到服务器时(消息被正确序列化为JSON-在Fiddler中进行了验证),服务器返回参数无法反序列化的错误。 在调试器的帮助下,我在SignalR中发现了一个bug(负责参数反序列化的JRawValue类在内部创建了自己的JsonSerializer实例,忽略了提供的实例)。通过替换似乎相当容易解决var settings = new JsonSerializerSettings
{
MaxDepth = 20
};
var serializer = JsonSerializer.Create(settings);
return serializer.Deserialize(jsonReader, type);
与
var serializer = GlobalHost.DependencyResolver.Resolve<IJsonSerializer>();
return serializer.Parse(jsonReader, type);
但我还发现接口IJsonSerializer将在未来版本的SignalR中删除。基本上,我需要的是从集线器方法获取原始JSON(或字节流),以便我可以自己对其进行反序列化,或者可以通过指定转换器等来调整序列化程序。
目前,我最后使用JObject参数类型定义方法:
public void SendMessage(JObject data)
然后使用
手动反序列化数据JObject.ToObject<IMessage>(JsonSerializer)
方法。但我更喜欢定制序列化程序,并将类型/接口放在集线器方法上。关于下一个SignalR的设计,"正确的方式"是什么?
我还发现有可能将我的代码中的原始JSON发送回客户端是很有用的,也就是说,这样SignalR就不会再次序列化该对象。我如何才能做到这一点?
推荐答案
如果您使用的是Connection API而不是Hub API,则可以将OnReceive事件和GET请求作为原始JSON(String)来处理。查看this example。
使用集线器API向客户端发送预串行化数据的功能是在2.x版本中添加的,我不知道在1.x中有什么方法可以做到这一点(请参阅github issue)
这篇关于SignalR集线器方法参数序列化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!