Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Serialization 信号器和序列化对象数组_Serialization_Signalr_Postsharp - Fatal编程技术网

Serialization 信号器和序列化对象数组

Serialization 信号器和序列化对象数组,serialization,signalr,postsharp,Serialization,Signalr,Postsharp,我是新来的信号员,做了一个简单的测试。我希望用类型化对象序列化对象数组。默认情况下,Signaler已将JSon.NET序列化程序配置为不提供类型信息。我发现我可以通过以下方式在DependencyResolver中注册自定义序列化程序: var serializer = new EventHubJsonSerializer( new JsonSerializerSettings { PreserveReferencesHandling =

我是新来的信号员,做了一个简单的测试。我希望用类型化对象序列化对象数组。默认情况下,Signaler已将JSon.NET序列化程序配置为不提供类型信息。我发现我可以通过以下方式在DependencyResolver中注册自定义序列化程序:

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”:“第二个事件(测试)”
}
]
}
]
}
干杯,
Mario

SignalR.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)"
        }
      ]
    }
  ]
}