问题标签 [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.

0 投票
6 回答
22770 浏览

c# - 使用 protobuf-net 的 C# 项目中的协议缓冲区 - 代码生成的最佳实践

我正在尝试在 C# 项目中使用 protobuf,使用 protobuf-net,并且想知道将其组织到 Visual Studio 项目结构中的最佳方法是什么。

当手动使用 protogen 工具将代码生成到 C# 中时,生活似乎很轻松,但感觉并不正确。

我希望 .proto 文件被视为主要源代码文件,生成 C# 文件作为副产品,但在 C# 编译器参与之前。

选项似乎是:

  1. 原型工具的自定义工具(虽然我看不到从哪里开始)
  2. 预构建步骤(调用 protogen 或执行此操作的批处理文件)

我一直在上面的 2)中挣扎,因为它一直给我“系统找不到指定的文件”,除非我使用绝对路径(而且我不喜欢强制明确定位项目)。

是否有一个约定(还)?


编辑: 根据@jon的评论,我重试了预构建步骤方法并使用了这个(protogen的位置现在硬编码),使用谷歌的地址簿示例:


Edit2: 采纳@jon 的建议,通过不处理 .proto 文件(如果它们没有更改)来最小化构建时间,我已经拼凑了一个基本工具来检查我(这可能会扩展到一个完整的自定义构建工具):

我的预构建命令现在是(全部在一行上):

0 投票
4 回答
2309 浏览

.net - C# 中的协议缓冲区:如何处理盒装值类型

在以下示例中:

我很好奇 protobuf-net 或 dotnet-protobufs 将如何处理这些类。我对protobuf-net比较熟悉,所以我实际拥有的是:

但是,我收到一条错误消息,提示“未找到合适的默认对象编码”。有没有一种简单的方法来处理这些课程,我只是不知道?

要详细说明用例:

这是远程处理中使用的数据类的缩小版本。所以基本上它看起来像这样:

注意:为简单起见,我省略了 ISerializable 实现,但正如您所期望的那样。

0 投票
1 回答
1111 浏览

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 参数。

0 投票
3 回答
22365 浏览

c# - 使用 protobuf-net 反序列化未知类型

我有 2 个联网应用程序,它们应该相互发送序列化的 protobuf-net 消息。我可以序列化对象并发送它们,但是,我无法弄清楚如何反序列化接收到的字节

我试图用这个反序列化,但它失败了一个 NullReferenceException。

我在包含消息类型 ID 的序列化字节之前传递了一个标头,我可以在一个巨大的 switch 语句中使用它来返回预期的子类类型。使用下面的块,我收到错误:System.Reflection.TargetInvocationException ---> System.NullReferenceException。

这是我用来通过网络发送消息的功能:

这个类,带有基类,我正在序列化:


使用 Marc Gravell 的建议进行了修复。我从只读属性中删除了 ProtoMember 属性。也切换到使用 SerializeWithLengthPrefix。这是我现在拥有的:

接收对象:

发送对象:

0 投票
1 回答
521 浏览

c# - 序列化和反序列化未知的继承类型

我开始考虑使用 proto-buf .Net 来满足媒体浏览器的序列化需求。

在新系统中,我们有一个可以用插件扩展的实体框架。

所以,比如我们在核心库中定义一个Media类,然后插件就可以定义Song等子类。

似乎 proto-buf .Net 需要了解我们核心定义的基类的所有子类型。

所以我应该用

但是……那时我对尚不存在的 Song 类一无所知。

是不是又回到了绘图板上?我是否正在尝试做一些图书馆不适合做的事情?

0 投票
2 回答
11883 浏览

c# - protobuf 和列表 - how to serialize / deserialize?

I have a List<object> with different types of objects in it like integers, strings, and custom types. All custom types are protobuf-adjusted. What I wanna do now i

I have a List<object> with different types of objects in it like integers, strings, and custom types. All custom types are protobuf-adjusted. What I wanna do now is to serialize / deserialize this list with protobuf.net. Up until now I suspect that I have to declare each and every type explicitly, which is unfortunately not possible with these mixed-list constructs. Because the binary formater has no problems to do these things I hope that I missed something and that you can help me out. So my question is how to deal with objects in protobuf.net.


(disclosure: I'm the author of protobuf-net)

BinaryFormatter is a metadata-based serializer; i.e. it sends .NET type information about every object serialized. protobuf-net is a contract-based serializer (the binary equivalent of XmlSerializer / DataContractSerializer, which will also reject this).

There is no current mechanism for transporting arbitrary objects, since the other end will have no way of knowing what you are sending; however, if you have a known set of different object types you want to send, there may be options. There is also work in the pipeline to allow runtime-extensible schemas (rather than just attributes, which are fixed at build) - but this is far from complete.


This isn't ideal, but it works... it should be easier when I've completed the work to support runtime schemas:

0 投票
1 回答
1731 浏览

c# - 混淆和 protobuf.net - 例外:未定义默认枚举值

尝试序列化包含混淆项目中的枚举的类时,出现以下异常:

ProtoBuf.ProtoException:未为可选属性 Y 定义默认枚举值 X

如果我从混淆中排除所有受影响的枚举,一切运行正常,但是,我切换到 protobuf.net 以便能够混淆更多代码内容,所以我希望有更好的解决方案。

那么是混淆器对 protobuf.net 造成了很大的影响,还是我以错误的方式声明我的枚举?

我努力了:

也根本没有合同和其他一些不那么明显的事情,但除了排除工作之外什么都没有。顺便说一句:在使用 protobuf.net 时,我们与枚举有什么关系吗?

0 投票
1 回答
13852 浏览

c# - ProtoInclude 属性是什么意思(在 protobuf-net 中)

ProtoBuf-Net实现中,ProtoInclude属性是什么意思,它有什么作用?

一个例子将不胜感激。

在这篇文章中看到了它,但我不确定它的作用。这个例子是:

另外,有没有办法使用protogen工具生成这种继承?

0 投票
6 回答
18263 浏览

c# - 序列化/反序列化的 XML 与二进制性能

我正在开发一个紧凑的框架应用程序,需要提高性能。该应用程序当前通过将对象序列化为 XML 并将它们存储在数据库中来离线工作。使用分析工具我可以看到这是相当大的开销,减慢了应用程序的速度。我想如果我切换到二进制序列化,性能会提高,但是因为紧凑框架不支持这一点,所以我查看了 protobuf-net。序列化似乎更快,但反序列化要慢得多,并且应用程序进行的反序列化比序列化更多。

二进制序列化应该更快吗?如果是,我能做些什么来加快性能?这是我如何使用 XML 和二进制文件的片段:

XML序列化:

Protobuf-net 二进制序列化:

0 投票
1 回答
2595 浏览

.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 服务或解决此问题的方法?

马克你在:)