问题标签 [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 投票
1 回答
1249 浏览

generics - protobuf-net 可以序列化这种接口和泛型集合的组合吗?

我正在尝试序列化一个ItemTransaction并且 protobuf-net (r282) 有问题。

和 ItemCollection 是这样的:

其中 T 是 Item 的派生类型。ItemCollection 还具有 IItemCollection 类型的属性。

我是这样序列化的:

我的最终目标是序列化 ItemTransaction,但被 IItemCollection 困住了。

项目及其派生类型可以毫无问题地 [反] 序列化,请参阅 [1],但反序列化 IItemCollection 失败(序列化工作)。ItemCollection 具有 ItemExpression 属性,并且在反序列化 protobuf 时无法创建抽象类。这对我来说很有意义,但我不知道如何通过它。

ItemExpression 和 Expression 一样是抽象的

我怎样才能让它正常工作?

此外,我担心 ItemTransaction 会失败,因为 IItemCollections 在编译时会有所不同且未知(ItemTransaction 将具有 FooCollection、BarCollection、FlimCollection、FlamCollection 等)。

我错过了什么(马克)?

[1] protobuf-net [de] 跨程序集边界的序列化

0 投票
1 回答
7709 浏览

c# - 在 Protobuf-net 中,我如何传递一个类型对象数组,其中包含不同类型的对象,提前知道潜在类型的集合

我正在尝试将使用 XmlSerializer 的现有代码迁移到 protobuf-net,因为它提供了更高的性能,但是我在这种特定情况下遇到了问题。

我有一个 object[] ,其中包含要发送到远程主机的参数(一种自定义的迷你 rpc 工具)。我知道这些参数可以是哪些类型,但我无法提前知道它们将按什么顺序发送。我有三个约束。首先是我在 Compact Framework 中运行,所以我需要在那里工作的东西。其次,正如我提到的,性能是一个大问题(在序列化方面),所以如果可能的话,我宁愿避免在那里使用大量的反射。最重要的是我关心这些参数的发送顺序。使用 XmlSerializer 只需添加 XmlInclude 就很容易,但是对于字段,据我所知,在 Protobuf-net 中没有任何等效项。那么,有没有办法做到这一点?这是一个简化的例子。

这仅适用于 XmlSerializer,但如果我尝试将其转换为 protobuf-net,我将收到“对象没有默认编码”消息。

我想出的最好方法是使用泛型和 [ProtoInclude],如本例所示。因为我可以在数组中拥有不同的对象类型,所以这并不完全成功。我为每个潜在类型添加了一个通用列表,并添加了一个带有 [ProtoIgnore] 类型为 object[] 的属性来添加它们并获取它们。添加它们时我必须使用反射(以知道将每个项目放在哪个数组中),这是不可取的,我仍然无法保留顺序,因为我只是一个接一个地提取每个列表上的所有项目并将它们放入属性 get 上的新对象 [] 数组。

我想知道是否有办法做到这一点?


我尝试了 Marc 下面的建议,但我无法让它发挥作用。我想我可能误会了什么。

使用您编写的代码。我想我应该使用 MessageParam Create 来生成 MessageParam 对象以添加到列表中。所以基本上我向 Message 添加了一个构造函数,如下所示:

但是,如果我这样做,我会得到“在序列化过程中发现意外类型;类型必须包含在 ProtoIncludeAttribute 中;发现 MessageParam`1 作为 MessageParam 传递”,因为我假设序列化程序需要非泛型版本。我误解了你的建议吗?如果是这样,正确的做法是什么?

0 投票
0 回答
411 浏览

c# - Compact Framework 中的协议缓冲区反序列化和动态加载的 DLL

我在这里的完整框架上看到了一个与此相关的问题。由于它似乎已经有很长一段时间没有得到解决,而且这是针对紧凑框架的,我认为为它创建一个新问题会更好。

我想反序列化我正在动态加载程序集的类型(使用 Assembly.LoadFrom)并且我收到“无法识别 ProtoIncludeAttribute 的已知类型”错误。

在我提到的相关问题中,暗示挂钩 AppDomain.AssemblyResolve 事件将有助于解决问题。它对整个框架有意义,但该事件在 CF 中不可用。我想知道是否有办法用 CF 做到这一点。

我使用的结构看起来很像这样,反序列化所需的所有类都是从同一个程序集中加载的。如果程序集被引用而不是动态加载,它可以正常工作,但如果动态完成则会失败。

0 投票
1 回答
4700 浏览

protobuf-net - 使用 protobuf-net 时将空字符串反序列化为空字符串

我正在使用 protobuf-net 序列化和反序列化我的消息。我的消息还包含可以为空的字符串。但是,当我在另一边反序列化它们时,我得到空字符串(“”)。

根据谷歌文档,字符串类型的默认值是空字符串。这个问题的解决方案是什么?

这是我正在使用的代码:

在反序列化相同的流后,我得到s_value = ""

0 投票
1 回答
1911 浏览

protobuf-net - 为 protobuf 的 java 实现调用 parseFrom 时程序挂起

我有一条消息(说它叫做 OuterMessage)

和内心的讯息

现在,当我在 OuterMessage 上调用 parseFrom 时,OuterMessage.parseFrom(buffer)该方法永远不会返回,也不会抛出任何异常。但如果我这样做InnerMessage.parseFrom(buffer),它会返回一个空的 InnerMessage 实例。

我正在使用 protobuf-net 序列化消息。知道可能导致问题的原因吗?

更新:我检查了调试器控制台并抛出了以下异常:

我检查了 java 和 C# 的 .proto 文件。该消息KeyValuePackageResponseProtocol还用于许多其他似乎初始化良好的消息。我应该看什么来解决这个问题?

0 投票
2 回答
798 浏览

.net - RESTful .NET 和 protobuf-net

是否可以在使用 WCF RESTful 入门工具包或 OpenRasta 创建的 RESTful Web 服务中使用 protobuf-net?如果可能,是否有可用的示例或代码片段?我正在创建一个将由 Java 客户端使用的 .NET Web 服务。

0 投票
1 回答
2806 浏览

c# - protobuf-net 中非必填字段的序列化

我有一个通过 ProtoBuf 序列化消息与 Google 通信的工作 Java 客户端。我目前正在尝试将该客户端翻译成 C#。

我有一个.proto文件,其中参数appId是可选字符串。它在 protobuf-net 库生成的 C# 表示中的默认值是一个空字符串,就像它在同一文件的 java 表示中一样。

我发现当我在 java 客户端中明确设置appId为时"",客户端停止工作(来自 Google 的 403 Bad Request)。appId当我在 java 客户端中明确设置null为时,一切正常,但只是因为hasAppId设置为 false(我不确定这如何影响序列化)。

在 C# 客户端中,我总是得到 403 响应。我没有看到不设置值和设置默认值之间的区别背后的任何逻辑,这似乎在 java 客户端中产生了所有差异。由于输出始终是二进制流,我不确定成功的 java 消息是用空字符串序列化,还是根本没有序列化。

在 C# 客户端中,我尝试将属性设置IsRequired为 trueProtoMember以强制它们进行序列化,并且我尝试将默认值设置为 null 并显式设置"",所以我很确定我已经尝试了一些配置值被序列化的地方。我也玩过ProtoBuf.ProtoIgnore并且在某些时候完全删除了appId参数,但我无法避免 C# 中的 403 错误。

我尝试从 java 手动复制序列化字符串,这解决了我的问题,所以我确定 HTTP 请求的其余部分正在工作,并且可以将错误追溯到序列化对象。

我的序列化是这样的:

我承认不太确定是什么DeepClone。有没有都试过了。。。

0 投票
1 回答
3898 浏览

c# - Google 协议缓冲区 - 固定大小的缓冲区?

使用 Google 协议缓冲区,我可以为我编码的所有消息设置最大大小吗?

如果我知道我编码的内容永远不会大于 X 字节,那么 Google Protobuffs 将始终生成大小为 Y 的缓冲区,如果我给它提供的数据量较少,则将其填充为大小 Y?

0 投票
1 回答
6481 浏览

c# - 如何使用 protobuf-net 处理 .proto 文件

我已经开始使用 protobuf-net lib 在我正在维护的一些程序之间进行通信。我还能够将消息从 C# 解码为 Ruby。我的 ruby​​ ProtoBuf lib 使用 .proto 文件来生成 ruby​​ 代码。为了必须在尽可能少的地方进行更改,我希望 protobuf-net 使用相同的 .proto 文件。虽然查看 protobuf-net 文件夹,但有一个名为 ProtoBufGenerator 的 Dll 和 protobuf exe,但我找不到任何关于是否可以使 protobuf-net 以这种方式工作的说明。

这可能吗?

0 投票
2 回答
10557 浏览

c# - Protobuf-net 有教程吗?

我一直在阅读有关 protobuf-net 的内容,这太棒了!

有没有我可以使用的教程?(更具体地Dictionary<TKey,TValue>为仿制药和合同)

有没有与之相关的提示?

我可以简单地将它插入我当前的代码库还是我需要做任何更改?