serialization - SignalR 和序列化对象数组

标签 serialization signalr postsharp

我是 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.JsonSerializerNewtonsoft.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/

相关文章:

c# - 如何使 Json.NET 成为默认的 Json 序列化程序

wpf - 通过 WCF 或类似方式发送 WPF 用户控件

serialization - 序列化还是存档?

asp.net - 使用SignalR和传输模式长轮询时,Asp.net session 永不过期

c# - 使用 Postsharp 在 VS2012 中编译 c# 项目时出错

structuremap - 您可以使用结构图将依赖项注入(inject) postsharp 属性吗

c# - 带有 xs :anytype causing serialization problems 的 WCF 消息

SignalR IE11 forewerFrame 内存泄漏

javascript - 在 Blazor 服务器端如何检测用户是否尝试离开当前页面

c# - 使用 PostSharp 1.5 实现 INotifyPropertyChanged