我是 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; }
}
并且接收器必须通过转换为动态来解开 bool 值:
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;
}
});
我所做的是应用在事件上的 postsharp 方面,以便允许它们通过我的 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)"
}
]
}
]
}
干杯,
马里奥
最佳答案
SignalR .NET 客户端不使用来自服务器的 DependencyResolver,并且当前没有自己的 IoC 容器。因此,正如您在问题中所指出的,您的自定义 JsonSerializerSettings 用于服务器上的序列化,但不用于客户端上的反序列化。
在 SignalR 的下一个版本中,我们计划向 .NET 客户端添加一个 DependencyResolver,这将允许您提供自己的 Newtonsoft.Json.JsonSerializer
或 Newtonsoft.Json.JsonSerializerSettings
在反序列化过程中使用。目前没有计划允许在 .NET 客户端中使用非 Json.NET(反)序列化程序。
如果你现在需要这个功能,你可以克隆 https://github.com/SignalR/SignalR.git并修改 private static T Convert<T>(JToken obj)
SignalR.Client\Hubs\HubProxyExtensions.cs 中的方法到 return obj.ToObject<T>(yourJsonSerializer)
.
关于serialization - SignalR 和序列化对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12589159/