SignalR和序列化对象数组(SignalR and serializing object arr

2019-07-31 21:56发布

我是新来SignalR并做了简单的测试黑客。 我想与序列类型对象的对象阵列。 默认情况下,SignalR已配置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; }
  }

和受体必须通过铸造动态解开布尔:

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配置输出 - 类型在$式传播,但它似乎没有deseralization期间使用。

{
  "$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)"
        }
      ]
    }
  ]
}

干杯,马里奥

Answer 1:

该SignalR .NET客户端不会从服务器使用DependencyResolver,目前还没有一个自己的IoC容器。 正因为如此,当你在你的问题请注意,您的自定义JsonSerializerSettings用于在服务器上的序列化而不是在客户端上反序列化。

在SignalR的下一个版本,我们计划在DependencyResolver添加到.NET客户端,让你提供自己的Newtonsoft.Json.JsonSerializerNewtonsoft.Json.JsonSerializerSettings反序列化过程中使用。 目前没有计划允许在.NET客户端使用non-Json.NET(反)序列化的。

如果您现在需要这个功能,你可以克隆https://github.com/SignalR/SignalR.git和修改private static T Convert<T>(JToken obj)在SignalR.Client \集线器\ HubProxyExtensions.cs方法return obj.ToObject<T>(yourJsonSerializer)



文章来源: SignalR and serializing object array