SignalR 和序列化对象数组

2024-02-29

我是 SignalR 的新手,并且已经完成了一个简单的测试 hack。我希望用类型化对象序列化对象数组。默认情况下,SignalR 已将 Json.NET 序列化器配置为不提供类型信息。我发现我可以通过以下方式在 DependencyResolver 中注册自定义序列化器:

var serializer =
    new EventHubJsonSerializer(
      new JsonSerializerSettings
        {
          PreserveReferencesHandling = PreserveReferencesHandling.Objects,
          TypeNameHandling = TypeNameHandling.Objects
        });

  GlobalHost.DependencyResolver.Register(typeof(IJsonSerializer), () => serializer);

但是,当我收到对象数组时,它不会解析类型,而是一个 JSon 容器。我可以用任何方式解决这个问题吗?

从 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; }
  }

并且接收器必须通过转换为动态来解开布尔值:

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 世界中拥有类型信息确实很好 - 其他客户端当然不会受益于此。

Update

这是我的 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 的下一个版本中,我们计划将 DependencyResolver 添加到 .NET 客户端,该客户端将允许您提供自己的Newtonsoft.Json.JsonSerializer or Newtonsoft.Json.JsonSerializerSettings在反序列化期间使用。目前没有计划允许在 .NET 客户端中使用非 Json.NET(反)序列化器。

If you need现在,您可以使用此功能could clone https://github.com/SignalR/SignalR.git https://github.com/SignalR/SignalR.git并修改private static T Convert<T>(JToken obj)SignalR.Client\Hubs\HubProxyExtensions.cs 中的方法return obj.ToObject<T>(yourJsonSerializer).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SignalR 和序列化对象数组 的相关文章

随机推荐

  • AWS Lambda 和 RDS 之间间歇性超时

    我们目前正在经历我只能描述为随机间歇AWS Lambda 和 RDS 之间的超时 部署我们的函数并成功运行它们后 它们可以随机切换到超时状态无需更改配置 值得注意的是 我们还在监视数据库连接 并可以确认我们没有遇到最大连接问题 以下是我们设
  • 表单右上角带有X的按钮,如何捕获此事件@C#

    当我使用 X 按钮关闭表单时会触发哪个事件 我想要仅在按下 X 按钮时触发的事件 我知道有一个 FormClosing 事件 但问题是每次关闭表单时都会触发它 当frm close 执行 我不希望这种情况发生 您可以检查 FormClosi
  • Angularjs 使用电子邮件类型重置表单字段

    在 AngularJs 中 似乎当您尝试通过将所有模型设置为空对象来 重置 表单时 如果输入是type email 这并没有得到清除 将其更改为type text 但是可以工作 但是您会在验证时丢失红色边框 是否有办法重置或清除电子邮件类型
  • 按元素长度对字符串数组进行排序

    拥有一个字符串数组 如何更新它 以便其元素按其长度排序 我正在尝试 string arr aa ss a abc arr arr OrderBy aux gt aux Length 所以 我会得到a aa ss abc 但它说 无法隐式转换
  • JVM JIT 诊断工具和优化技巧

    我听说过很多关于 JVM JIT 的内容can这样做 但没有看到很多关于如何分析 JIT 在程序的给定运行中实际执行的操作的信息 有很多使用技巧 XX PrintCompilation and XX PrintOptoAssembly但它会
  • 如何使用 Python Selenium Webdriver 在 Chrome 中加载默认配置文件?

    我想使用 Python 的 webdriver 启动 Chrome 及其默认配置文件 以便 cookie 和站点首选项在会话中保持不变 我怎样才能做到这一点 这就是它最终为我工作的原因 from selenium import webdri
  • 忘记旧的 WiFi Direct 连接

    有没有办法忘记旧的 WiFi Direct 连接 在代码中 我需要这个来更改谁成为群组所有者 我设置 groupOwnerIntent 15 但尚未成为组所有者 如果您只想断开与现有的连接WiFiP2p连接 然后只需调用WiFiP2pMan
  • 将大量数据加载到数组中的最快方法

    我在 stackexchange 中广泛搜索了一个将巨大 2GB dat 文件加载到 numpy 数组中的简洁解决方案 但没有找到合适的解决方案 到目前为止 我设法以非常快的方式 list f open myhugefile0 for li
  • C++ 在张量流中使用 Eigen

    张量流和特征值之间有什么关系 特别是关于tensor数据结构 有一些较旧的引文 例如 其中指出tensorflow正在广泛使用Eigen 据我所知 tensorflow人员已经扩展了Eigen代码 然而 最近的张量流文档似乎没有明确提及 E
  • SQL 2008 中的内存不足异常

    关于SQL Server 2008中Out of Memory异常 当我执行向表中插入数千行的大型查询时 执行此操作时发生的异常是 System OutOfMemoryException 根据一篇非常好的微软知识库文章 链接在这里 http
  • 如何获取 MongoDB 中的所有文档 ID?

    如何获取 MongoDB 中所有文档 ID 的数组 我只需要一组 id 但不需要文档内容 您可以通过调用在 Mongo shell 中执行此操作map http docs mongodb org manual reference metho
  • 为 MVC 应用程序添加尾部斜杠

    我正在构建一个基于 MVC 设计模式的应用程序 我希望我的 URL 如下 http example com page action http example com page action 我成功地让它与下面的代码一起工作 但如果 URL
  • 如果我要将文件内容读入数组,是否需要初始化数组?

    我正在初始化buf在立即用以下内容重写其内容之前不必要地全为零read exact fn parse
  • 在 Python 代码中使用 Git 命令

    我被要求编写一个脚本 从 Git 中提取最新代码 进行构建并执行一些自动化单元测试 我发现有两个内置的 Python 模块可以随时使用 用于与 Git 交互 GitPython and libgit2 我应该使用什么方法 模块 更简单的解决
  • 在输入类型=“文本”中键入时跟踪 onchange 的最佳方法?

    在我的经验中 input type text onchange事件通常仅在您离开后发生 blur 控制 有没有办法强制浏览器触发onchange每次textfield内容变化 如果不是 那么 手动 跟踪这个最优雅的方法是什么 Using o
  • 在 Razor 中将视图模型属性编码为 JavaScript

    我有一个简单的视图模型 public class IndexViewModel public bool ShowWelcomeMsg get set 在我看来 我需要 JS 中的这个属性 但这是不正确的 因为它输出False代替false但
  • 使用PyQt5嵌入动态条形图

    我在 python 中编写了以下代码 以在生成的 GUI 中显示条形图PyQt5 import sys from PyQt5 QtWidgets import QDialog QApplication QPushButton QVBoxLa
  • Libgdx ModelBuilder.createRect 仅从一侧可见

    在我的第一个 libgdx 3D 游戏中 我现在从createBox to createRect 仅创建可见面 如果一堵墙位于另一堵墙的左侧 则其右面不可见 我正在创建 4 个模型 frontFace backFace rightFace
  • 如何在React-native ListView中过滤数据?

    我正在尝试过滤数组对象列表 然后尝试使用新的数据源在 ListView 中显示 但是 该列表并未被过滤 我知道我的过滤功能工作正常 我在console log中检查过 我正在使用 Redux 将状态映射到 prop 然后尝试过滤道具 这是错
  • SignalR 和序列化对象数组

    我是 SignalR 的新手 并且已经完成了一个简单的测试 hack 我希望用类型化对象序列化对象数组 默认情况下 SignalR 已将 Json NET 序列化器配置为不提供类型信息 我发现我可以通过以下方式在 DependencyRes