Serialization 信号器和序列化对象数组
我是新来的信号员,做了一个简单的测试。我希望用类型化对象序列化对象数组。默认情况下,Signaler已将JSon.NET序列化程序配置为不提供类型信息。我发现我可以通过以下方式在DependencyResolver中注册自定义序列化程序:Serialization 信号器和序列化对象数组,serialization,signalr,postsharp,Serialization,Signalr,Postsharp,我是新来的信号员,做了一个简单的测试。我希望用类型化对象序列化对象数组。默认情况下,Signaler已将JSon.NET序列化程序配置为不提供类型信息。我发现我可以通过以下方式在DependencyResolver中注册自定义序列化程序: var serializer = new EventHubJsonSerializer( new JsonSerializerSettings { PreserveReferencesHandling =
var serializer =
new EventHubJsonSerializer(
new JsonSerializerSettings
{
PreserveReferencesHandling = PreserveReferencesHandling.Objects,
TypeNameHandling = TypeNameHandling.Objects
});
GlobalHost.DependencyResolver.Register(typeof(IJsonSerializer), () => serializer);
但是,当我收到我的对象数组时,它不会解析类型,而是一个JSonContainer。我能以任何方式解决这个问题吗
从集线器发出的事件:
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; }
}
这是一个非常简单的方面,但是在.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)"
}
]
}
]
}
{
“$id”:“11”,
“$type”:“f__匿名类型0`3[[System.String,mscorlib],[System.String,mscorlib],[System.Object[],mscorlib]],信号器”,
“Hub”:“Externalize.EventHub”,
“方法”:“PushEvent”,
“Args”:[
{
“$id”:“12”,
“$type”:“DataDuctus.SignalR.Aspects.SignalREvent,DataDuctus.SignalR.Aspects”,
“组”:“全部”,
“事件名称”:“SimpleEvent”,
“TypeFullName”:“TestConsole.TestEvents”,
“事件参数”:[
{
“$id”:“13”,
“$type”:“TestConsole.TestEventTargets,TestConsole”,
“请勿打印”:错误,
“EventName”:“第二个事件(测试)”
}
]
}
]
}
干杯,
MarioSignalR.NET客户端不使用服务器上的DependencyResolver,并且当前没有自己的IoC容器。因此,正如您在问题中所注意到的,您的自定义JsonSerializerSettings用于服务器上的序列化,而不是客户端上的反序列化 在SignalR的下一个版本中,我们计划向.NET客户端添加一个DependencyResolver,它将允许您提供自己的
Newtonsoft.Json.Json序列化程序
或Newtonsoft.Json.Json序列化设置
,以便在反序列化过程中使用。目前没有计划允许在.NET客户端中使用非Json.NET(反)序列化程序
如果您现在需要此功能,可以将signal.Client\Hubs\HubProxyExtensions.cs中的
private static T Convert(JToken obj)
方法克隆并修改为return obj.ToObject(yourJsonSerializer)
我是否正确理解您正在将不同类型的对象放入服务器上的SignalREvent.EventArguments中,您希望序列化的JSON将包含一些类型信息,以便在客户端上实例将反序列化为这些类型?是的,确实如此-我已使用this.hubConnection.Received+=Console.WriteLine;//MarioApparent,如果您将对象类型包装在一个数组中,然后自己执行数组元素的反序列化,那么您可以返回对象类型!我花了一天的时间试图弄明白这一点,我认为现在发生的是,Signar正在反序列化单个对象并抛出类型数据,但它没有反序列化数组,因此您可以从服务器获得原始JSON,您可以做您想要做的事,感谢您的响应!是的,我现在可以看到它(从Git)-你会考虑有一个自定义的序列化取决于集线器本身。我目前计划使用6-8个不同的“服务”和活动中心。有些是从网站上使用的,有些是由.net代码使用/调用的。实际上,我只想使用不同的配置(现在-切换到bson for.net-.net很有吸引力;)这取决于.net或.net与“一切”。又是坦克!
[ExternalizeEvent]
public event ASimpleDelegate SimpleEvent;
{
"$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)"
}
]
}
]
}