我是 SignalR 的新手,并且做了一个简单的测试破解。我希望用类型化的对象序列化一个对象数组。默认情况下,SignalR 已将 JSon.NET 序列化程序配置为不提供类型信息。我发现我可以通过以下方式在 DependencyResolver 中注册一个自定义序列化程序:
var serializer =
new EventHubJsonSerializer(
new JsonSerializerSettings
{
PreserveReferencesHandling = PreserveReferencesHandling.Objects,
TypeNameHandling = TypeNameHandling.Objects
});
GlobalHost.DependencyResolver.Register(typeof(IJsonSerializer), () => serializer);
但是,当我收到我的对象数组时,它不会解析类型,而是一个 JSonContainer。我能以任何方式解决这个问题吗?
从 Hub 发出的事件:
public sealed class SignalREvent
{
public string Group { get; set; }
public string EventName { get; set; }
public string TypeFullName { get; set; }
public IList<object> EventArguments { get; set; }
}
并且接收器必须通过转换为动态来解开布尔值:
public sealed class TestEventArgs : EventArgs
{
#region Public Properties
/// <summary>
/// Gets or sets a value indicating whether do not print.
/// </summary>
public bool DoNotPrint { get; set; }
/// <summary>
/// Gets or sets the event name.
/// </summary>
public string EventName { get; set; }
#endregion
}
this.subscription = this.client.On<SignalREvent>(
"PushEvent",
data =>
{
dynamic eventArg1 = data.EventArguments[0];
if (eventArg1.DoNotPrint.Value)
{
return;
}
});
我所做的是将后锐化方面应用于事件,以允许它们通过我的 EventHub 通过 SignalR 传播。例如:
[ExternalizeEvent]
public event ASimpleDelegate SimpleEvent;
这是一个非常简单的方面,但是在 .net 世界中拥有类型信息真的很好 - 其他客户当然不会从中受益。
更新
这是我的 JSon.NET 配置的输出 - 类型在 $type 中传播,但似乎在反序列化期间没有使用它。
{
"$id": "11",
"$type": "<>f__AnonymousType0`3[[System.String, mscorlib],[System.String, mscorlib],[System.Object[], mscorlib]], SignalR",
"Hub": "Externalize.EventHub",
"Method": "PushEvent",
"Args": [
{
"$id": "12",
"$type": "DataDuctus.SignalR.Aspects.SignalREvent, DataDuctus.SignalR.Aspects",
"Group": "all",
"EventName": "SimpleEvent",
"TypeFullName": "TestConsole.TestEvents",
"EventArguments": [
{
"$id": "13",
"$type": "TestConsole.TestEventArgs, TestConsole",
"DoNotPrint": false,
"EventName": "second event (test)"
}
]
}
]
}
干杯,马里奥