问题标签 [protobuf-net]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 使用 protobuf-net 的 C# 项目中的协议缓冲区 - 代码生成的最佳实践
我正在尝试在 C# 项目中使用 protobuf,使用 protobuf-net,并且想知道将其组织到 Visual Studio 项目结构中的最佳方法是什么。
当手动使用 protogen 工具将代码生成到 C# 中时,生活似乎很轻松,但感觉并不正确。
我希望 .proto 文件被视为主要源代码文件,生成 C# 文件作为副产品,但在 C# 编译器参与之前。
选项似乎是:
- 原型工具的自定义工具(虽然我看不到从哪里开始)
- 预构建步骤(调用 protogen 或执行此操作的批处理文件)
我一直在上面的 2)中挣扎,因为它一直给我“系统找不到指定的文件”,除非我使用绝对路径(而且我不喜欢强制明确定位项目)。
是否有一个约定(还)?
编辑: 根据@jon的评论,我重试了预构建步骤方法并使用了这个(protogen的位置现在硬编码),使用谷歌的地址簿示例:
Edit2: 采纳@jon 的建议,通过不处理 .proto 文件(如果它们没有更改)来最小化构建时间,我已经拼凑了一个基本工具来检查我(这可能会扩展到一个完整的自定义构建工具):
我的预构建命令现在是(全部在一行上):
.net - C# 中的协议缓冲区:如何处理盒装值类型
在以下示例中:
我很好奇 protobuf-net 或 dotnet-protobufs 将如何处理这些类。我对protobuf-net比较熟悉,所以我实际拥有的是:
但是,我收到一条错误消息,提示“未找到合适的默认对象编码”。有没有一种简单的方法来处理这些课程,我只是不知道?
要详细说明用例:
这是远程处理中使用的数据类的缩小版本。所以基本上它看起来像这样:
注意:为简单起见,我省略了 ISerializable 实现,但正如您所期望的那样。
c# - 协议缓冲区反序列化和动态加载的 DLL
我正在使用 protobuf-net 进行协议缓冲。我有一个动态加载的 dll。我可以创建包含在 dll 中的数据类的实例,并且可以使用和修改创建的数据对象。但是,当我尝试序列化/反序列化数据对象时,会出现以下崩溃:
{“无法识别 ProtoIncludeAttribute 的已知类型:MyDataDLL.MyDataClass, MyDataDLL, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null”}
有时崩溃说 MyDataClass 不是 MyBaseClass 的子类,或者类似的东西。MyDataClass 肯定继承自 MyBaseClass,并且 MyBaseClass 具有 MyDataClass 的 ProtoInclude 标记。
崩溃发生在“method.invoke”上
如果我在项目中引用 dll 并以这种方式使用它,我不会崩溃。所以我知道这是一个工作的dll。
更新:是的,MyDataClass 和 MyBaseClass 在同一个程序集中。
以下是我的代码与您的测试类所做的不同之处的列表,尽管它可能并不广泛:MyDataClass 是 7 个 ProtoIncludes 列表中的第 4 个。
MyBaseClass 包含所有数据字段,MyDataClass 包含操作这些数据字段的函数的逻辑。所以在 MyDataClass 中没有 ProtoMember 调用。
MyBaseClass 实现了 IExtensible 接口,并具有以下函数来处理附加数据:
它可能不会影响任何东西,但我的 ProtoContracts 使用 Name 参数。
c# - 使用 protobuf-net 反序列化未知类型
我有 2 个联网应用程序,它们应该相互发送序列化的 protobuf-net 消息。我可以序列化对象并发送它们,但是,我无法弄清楚如何反序列化接收到的字节。
我试图用这个反序列化,但它失败了一个 NullReferenceException。
我在包含消息类型 ID 的序列化字节之前传递了一个标头,我可以在一个巨大的 switch 语句中使用它来返回预期的子类类型。使用下面的块,我收到错误:System.Reflection.TargetInvocationException ---> System.NullReferenceException。
这是我用来通过网络发送消息的功能:
这个类,带有基类,我正在序列化:
使用 Marc Gravell 的建议进行了修复。我从只读属性中删除了 ProtoMember 属性。也切换到使用 SerializeWithLengthPrefix。这是我现在拥有的:
接收对象:
发送对象:
c# - 序列化和反序列化未知的继承类型
我开始考虑使用 proto-buf .Net 来满足媒体浏览器的序列化需求。
在新系统中,我们有一个可以用插件扩展的实体框架。
所以,比如我们在核心库中定义一个Media类,然后插件就可以定义Song等子类。
似乎 proto-buf .Net 需要了解我们核心定义的基类的所有子类型。
所以我应该用
但是……那时我对尚不存在的 Song 类一无所知。
是不是又回到了绘图板上?我是否正在尝试做一些图书馆不适合做的事情?
c# - 混淆和 protobuf.net - 例外:未定义默认枚举值
尝试序列化包含混淆项目中的枚举的类时,出现以下异常:
ProtoBuf.ProtoException:未为可选属性 Y 定义默认枚举值 X
如果我从混淆中排除所有受影响的枚举,一切运行正常,但是,我切换到 protobuf.net 以便能够混淆更多代码内容,所以我希望有更好的解决方案。
那么是混淆器对 protobuf.net 造成了很大的影响,还是我以错误的方式声明我的枚举?
我努力了:
和
也根本没有合同和其他一些不那么明显的事情,但除了排除工作之外什么都没有。顺便说一句:在使用 protobuf.net 时,我们与枚举有什么关系吗?
c# - ProtoInclude 属性是什么意思(在 protobuf-net 中)
在ProtoBuf-Net实现中,ProtoInclude属性是什么意思,它有什么作用?
一个例子将不胜感激。
我在这篇文章中看到了它,但我不确定它的作用。这个例子是:
另外,有没有办法使用protogen工具生成这种继承?
c# - 序列化/反序列化的 XML 与二进制性能
我正在开发一个紧凑的框架应用程序,需要提高性能。该应用程序当前通过将对象序列化为 XML 并将它们存储在数据库中来离线工作。使用分析工具我可以看到这是相当大的开销,减慢了应用程序的速度。我想如果我切换到二进制序列化,性能会提高,但是因为紧凑框架不支持这一点,所以我查看了 protobuf-net。序列化似乎更快,但反序列化要慢得多,并且应用程序进行的反序列化比序列化更多。
二进制序列化应该更快吗?如果是,我能做些什么来加快性能?这是我如何使用 XML 和二进制文件的片段:
XML序列化:
Protobuf-net 二进制序列化:
.net - Protobuf-net 如何在 NET CF 客户端中使用 WCF 服务?
我正在尝试使用 Protobuf-net 的 RPC 功能来使用 WCF Web 服务。这是我的服务合同:
下面是我的 .NET CF 客户端:
类 EchoServiceClient : ProtoClient, IEchoService {
这就是我尝试使用网络服务的方式:
我不断收到以下消息的异常:
必须将 ContentLength 设置为非负数,或者将 SendChunked 设置为 true,以便在 AllowWriteStreamBuffering 禁用时执行写入操作。
据我在挖掘protobuf-net的源代码后所知,问题似乎是没有指定内容长度。有没有其他方法可以使用 .NET CF 中的 protobuf-net 序列化来使用 WCF Web 服务或解决此问题的方法?
马克你在:)