套接字上的 Protobuf-net 序列化。找不到无参数构造函数 ProtoException

2024-02-22

我创建了一个使用套接字完成进程间通信的应用程序。当客户端连接到我创建的服务器并发送序列化消息时,该过程开始。这条消息,我使用 Protobuf-net、SerializeWithLengthPrefix 进行序列化,并使用 DeserializeWithLengthPrefix 对其进行反序列化。客户端将消息发送到服务器,服务器完美地反序列化消息,但在服务器到客户端的情况下,情况并非如此。

主类是BaseMessage,它是抽象的。

[Serializable, ProtoContract, ProtoInclude(5001, typeof(LogonMessage))]
abstract public class BaseMessage
{
    public BaseMessage()
    {

    }

    abstract public int MessageType { get; }
}

LogonMessage 实现了 BaseMessage 类。

[Serializable, ProtoContract]
public class LogonMessage : BaseMessage
{
    public LogonMessage()
    {

    }

    [ProtoMember(1)]
    public string Broker { get; set; }

    [ProtoMember(2)]
    public int ClientType { get; set; }

    public override int MessageType
    {
        get { return 1; }
    }
}

初次握手后,客户端请求一些在 protobuf-net 的帮助下序列化的服务,而我这边的本地服务器通过从网络上的另一台服务器请求数据来为其提供服务。从客户端到服务器的消息传输是完美完成的。

当我的服务器从 Web 服务器接收到数据时,它会将其序列化并将数据发送到客户端。但这一次,当我尝试使用相同的过程在客户端反序列化数据时,出现以下异常: “没有找到 BaseMessage 的无参数构造函数”

我使用以下代码行进行反序列化(这是发生异常的地方)。

BaseMessage baseMessage = Serializer.DeserializeWithLengthPrefix<BaseMessage>(networkStream, PrefixStyle.Base128);

这就是消息在服务器上序列化的方式。

Serializer.SerializeWithLengthPrefix(networkStream, baseMessage, PrefixStyle.Base128);

客户端和服务器之间连接开始时使用的 NetworkStream 存储在一个对象中,该对象存储在字典中。我从字典中的该对象中挑选出相同的 NetworkStream 并使用它将序列化数据发送到客户端(从服务器)。但就会出现上述问题。有什么帮助吗?

提前致谢...


这在任何 v2 版本中都应该可以正常工作; 2.0.0.480 是当前在 NuGet 上公布的下载版本,但 2.0.0.580 也可用。我检查了 1.0.0.280 和 2.0.0.480,它们都没有显示此症状,所以我猜测您使用的是不同的版本。因此,我的建议是:确保您选择这两者之一(或更高版本,如果有的话)。

有关信息,您不需要[Serializable]对于 protobuf-net,但它也没有什么坏处。另外,你的BaseMessage构造函数可能应该是protected (public对于 a 的构造函数来说并没有真正意义abstract类型)。但既然编译器做了这一切自动为你,你可以简化:

[ProtoContract, ProtoInclude(5001, typeof(LogonMessage))]
abstract public class BaseMessage
{
    abstract public int MessageType { get; }
}


[ProtoContract]
public class LogonMessage : BaseMessage
{
    [ProtoMember(1)]
    public string Broker { get; set; }

    [ProtoMember(2)]
    public int ClientType { get; set; }

    public override int MessageType
    {
        get { return 1; }
    }
}

其他想法:5001有点偏高;您将从低值包含编号中获得更高的效率。1跃入脑海。他们不必是普遍地unique:在该类型中是唯一的。

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

套接字上的 Protobuf-net 序列化。找不到无参数构造函数 ProtoException 的相关文章

  • 根据另一个列表的内容对列表进行排序

    我有一个包含整数列表的列表和另一个包含同时包含整数和字符串的类的列表 我想做的是按字母顺序对列表进行排序 将第一个列表中存在的条目放在前面 这是我的代码和预期输出 using System using System Collections
  • 限制纬度和经度值的模数

    我有代表纬度和经度的双精度数 我可以轻松地将经度限制为 180 0 180 0 具有以下功能 double limitLon double lon return fmod lon 180 0 360 0 180 0 这是有效的 因为一端是排
  • 实体框架 5 不清除导航属性

    我在 Entity Framework 5 中遇到了这个奇怪的问题 我在其中一个实体中有一个导航属性 我想将其设置为null 但由于某种原因 该属性只有在我第二次调用该属性时才会被清除 using var db new Entities v
  • 将 gcov 与 CMake/CDash 结合使用的详细指南?

    我在我的项目中使用 CMake 并设置了 cdash 服务器以进行连续 夜间构建 一切运行良好 通过设置 crontab 我们可以将每小时 每晚的构建 测试结果自动上传到我们的 cdash 服务器 我的下一步是将测试覆盖率报告添加到构建中
  • WCF 版本控制枚举

    我开始编写一些需要向前兼容和版本控制的 WCF 数据协定 我一直在阅读 MSDN 文章here http msdn microsoft com en us library ms733832 aspx 并且想知道是否有人对有关枚举的第 14
  • 如何在 asp .net mvc 2 中对不直接属于我的模型的对象使用 DisplayFor()?

    我确信我在这里遗漏了一些非常简单的东西 我创建了一个自定义日期时间显示模板 使用以下方法时效果很好 但是 我遇到了这样的情况 在部分控件内 我在 for 循环中迭代模型中的对象 我想要一个 DateTime 属性来使用显示模板 但我不知道如
  • C# 列表框 ObservableCollection

    我正在尝试使用 ListBox DataSource ObservableCollection 但是我不知道如何在 OC 更新时让列表框自动更新 我可以在 OC 上挂接 CollectionChanged 事件 但是我需要对列表框执行什么操
  • 如何检查是否发生溢出? [复制]

    这个问题在这里已经有答案了 可能的重复 检测 C C 中整数溢出的最佳方法 https stackoverflow com questions 199333 best way to detect integer overflow in c
  • 当应用程序未聚焦时监听按键

    我有一个应用程序 C 4 0 WPF 它是隐藏的 可以通过单击系统托盘图标或我创建的其他框架 停靠在左侧和最上面的小框架 来显示 My customer wants to add a new way to display the appli
  • 在 C# 中使用 as 关键字与泛型类型发生冲突的编译时行为

    当尝试对无法转换为的非泛型类型使用 C as 关键字时 编译器会给出无法转换类型的错误 但是 当对泛型类型使用 as 关键字时 编译器不会给出错误 public class Foo public class Bar
  • 在 C# 4.0 中,是否可以从泛型类型参数派生类?

    我一直在尝试这个 但我似乎无法弄清楚 我想做这个 public abstract class SingletonType
  • Facebook Graph API“/userid/feed”返回空白

    我正在使用 Facebook C SDK 但似乎无法使用 Graph API 获取反馈数据 我已从用户那里获得了以下扩展权限 范围 离线访问 publish stream publish checkins create event read
  • 当“多次安装 MSBuild”时,Dotnet 项目转换尝试转换失败

    try convert w Test csproj target framework netstandard2 0 结果是 Multiple installs of MSBuild detected please select one In
  • g++4.9 不支持 std::align

    在学习对齐问题等时 我意识到我的 g 4 9 macports OS X 实现不支持std align 如果我尝试编译 使用 std c 11 此示例代码来自http www cplusplus com reference memory a
  • 如何在OpenGL中像这样绘制连接的带状线

    我想用以下方式绘制一系列连接线 GL LINE STRIP 我尝试过自己编写代码 但没有得到想要的结果 所以我来到这里 帮助我找出我错在哪里 这里我只给出我的draw 函数 glBegin GL LINE STRIP glVertex2f
  • STL 向量、迭代器和插入 (C++)

    我有一个将向量的迭代器传递到的方法 在这个方法中 我想向向量中添加一些元素 但我不确定当只有迭代器时这是否可行 void GUIComponentText AddAttributes vector
  • 更改预处理到文件后出现错误 1 ​​错误 LNK1104

    我必须使用预处理器 所以我改变了 配置属性 gt C gt 预处理器 gt 预处理为文件 gt 是 并得到错误 错误 1 错误 LNK1104 无法打开文件 Debug asnreal obj 这个问题的解决办法 我必须在 lib 文件的路
  • Python 中的 C 指针算术

    我正在尝试将一个简单的 C 程序转换为 Python 但由于我对 C 和 Python 都一无所知 这对我来说很困难 我被 C 指针困住了 有一个函数采用 unsigned long int 指针并将其值添加到 while 循环中的某些变量
  • 任何浮点密集型代码是否会在任何基于 x86 的架构中产生位精确的结果?

    我想知道使用浮点运算的 C 或 C 代码是否会在任何基于 x86 的体系结构中产生位精确的结果 无论代码的复杂性如何 据我所知 自 Intel 8087 以来的任何 x86 架构都使用准备处理 IEEE 754 浮点数的 FPU 单元 并且
  • AddressAccessDeniedException :无需 netsh 即可解决它?

    我遇到了异常AddressAccessDeniedException因为我的processus没有注册URL的权限 我首先以管理员身份运行我的程序 好的 它成功了 但我现在想要分发我的应用程序 并且我希望每个用户都能够运行它 而不必成为管理

随机推荐

  • 如何获取给定 ascii 值的字符

    如何获取给定 ascii 代码的 ascii 字符 例如我正在寻找一种方法 给定代码 65 将返回 A Thanks 您的意思是 A astring 或 A 一个char int unicode 65 char character char
  • 在 Python 中搜索对象列表

    假设我正在创建一个简单的类 其工作方式与 C 风格结构类似 仅保存数据元素 我试图弄清楚如何在对象列表中搜索属性等于特定值的对象 下面是一个简单的例子来说明我正在尝试做的事情 例如 class Data pass myList for i
  • Vue mousemove仅在mousedown之后

    如何仅在首先单击元素时触发鼠标移动 我正在尝试将其用于音频播放器时间线 player time bar mousedown setNewCurrentPosition event slider role slider aria valuem
  • 许可 .Net 网站 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想知道获得网站许可的首选方法是什么 我使用可编辑的 APSX 文件分发网站的预编译版本 后面的代码被编译到每个页面的单独 DLL 中
  • Shell 脚本从日志中获取过去一小时的异常

    我正在开发脚本 该脚本将 grep 最近一小时的日志并检查任何异常并向Solaris 平台发送电子邮件 我做了以下步骤 grep n h date Y m d H M test logs 上面的命令给了我行号 然后我执行以下操作 tail
  • 两个点云的稳健配准

    我需要找到两个 3D 点云之间的变换和旋转差异 为此 我正在寻找点云库 因为它看起来很理想 在干净的测试数据上 我有迭代最近点 ICP 工作 但得到奇怪的结果 尽管我可能错误地实现了它 我有pcl estimateRigidTransfor
  • 动态改变无点参数

    我想在数据库中存储 less 参数 一个示例用例可能是每个用户根据他或她的偏好更改颜色 我认为最好的方法是解析所有 less 文件以获取参数 然后用户可以设置参数 这些参数将保存在针对用户的数据库中 当请求 less 文件时 处理程序重载可
  • 这种加密方式“安全”吗?

    首先我必须说我从来没有学过密码学 我所知道的关于这个主题的一切都只是基本概念 我们正在寻找一种快速 简单的方法来使用密码加密一些数据 将存储到数据库中 我知道 最安全 的算法是 AES 但它对我们来说可能太复杂 而且我知道它需要我们获得美国
  • 使用 Google App Engine Standard 的私有 npm 注册表

    对于所有其他 stackoverflow 问题 人们似乎都在询问私有 npm git 存储库或不同的技术堆栈 我很确定我可以在 GAE Flex 中使用私有 npm 注册表 但我想知道标准版本是否可以 来自GAE 标准文档 https cl
  • EC2实例类型的确切网络性能?

    我在 Amazon 上找不到不同 EC2 实例类型的确切网络性能详细信息 相反 他们只是说 High Moderate Low 这究竟意味着什么 我特别想知道具体的数量Traffic OUT在每个实例类型上 我需要进行直播 我的流比特率为
  • 如何使用通过页面基页附加到页面的母版页?

    在我的 ASP Net Web 应用程序中 我有一个基页面 它实现了跨 Web 应用程序所有页面的功能 并且我的网页派生自该基页面 由于整个网站只有一个母版页 因此我不想在每个网页中附加母版页 因此 我通过基本页的 OnPreInit 方法
  • 我想将表中列的值更新为标题大小写

    我在数据库中有一个表 其中存在列名称 我想将该名称字段中的值更新为标题大小写 例子 abc asd to Abc Asd 考虑到表中有数百万条记录 我想知道使用 SQL 执行此操作的最佳方法是什么 数据卫生是一场持久战 正确的案例从来都不像
  • 检查 .net core 中动态加载库的依赖关系

    我正在尝试创建使用外部 dll s 中的一些函数的插件 因为我不知道将使用哪个插件 所以我想动态加载 主要的 ASP NET Core 项目 它使用反射动态加载诸如 mailservice dll 之类的插件 mailservice dll
  • Python 中的多重分割

    如何将字符串拆分为两个相反的值 例如 and 是 分隔符 我有以下字符串 Wouldn t it be most beneficial to have at least some idea 我需要以下输出 作为数组 Wouldn t it
  • SwiftUI 中的内容是什么?

    在文档中 我看到Content在不同的上下文中 A modifier that can be applied to a view or other view modifier producing a different version of
  • 为什么 web.xml 'context-param' 不能包含字符 [children]?

    我只是好奇这会发生什么web xml我遇到此错误的代码cvc complex type 2 3 Element context param cannot have character children because the type s
  • 有没有办法生成 rmarkdown 文档的缓存版本,然后直接从缓存生成多个输出?

    我正在执行一些计算密集型操作 我想从中生成报告 我正在尝试使用 bookdown 或直接降价 本质上我想要一个 html document 报告和一个 word document 报告 我的 Rmd 文件如下所示 title My anal
  • 如何将自动行中的网格项与行跨度垂直对齐?

    我使用 CSS 网格布局以类似表格的方式显示数据 最后一列跨越多行 虽然现在这基本上可以工作 但我绝对无法获得正确的垂直对齐 请参阅以下片段 div border 1px solid black padding 3px table disp
  • 在 GCC 中设置 std=c99 标志

    我想知道是否有任何文件可以设置 std c99标志 这样我就不必为每个编译都设置它 我在 Ubuntu 上使用 GCC 4 4 而不是打电话 usr bin gcc use usr bin c99 这是 Single Unix 认可的调用
  • 套接字上的 Protobuf-net 序列化。找不到无参数构造函数 ProtoException

    我创建了一个使用套接字完成进程间通信的应用程序 当客户端连接到我创建的服务器并发送序列化消息时 该过程开始 这条消息 我使用 Protobuf net SerializeWithLengthPrefix 进行序列化 并使用 Deserial