问题标签 [protobuf-csharp-port]

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 投票
0 回答
4274 浏览

c# - c++ 中的 Google protobuf SerializeToString 函数和 c# 中的 WriteTo 函数

我想在 c# 和 c++ 中使用 google protobuf。我使用 protobuf-csharp-port 在 c# 中生成代码。c++ 和 c# 中的 protobuf 代码是从同一个 .proto 文件生成的,我设置了相同的对象价值。

C++代码:

c#代码:

我想将对象序列化为字符串,所以我在 c++ 中使用了 SerializeToString 函数,在 c# 中使用了 WriteTo 函数。像这样:

C++代码:

c#代码:

但是,c++ 中 strBody 的结果与 c# 中的结果不同。为什么以及我该怎么做。 c++ 值:

c#值:

0 投票
0 回答
2056 浏览

c# - Proto 3:继承格式消息

我正在编写一个通用 SDK,我计划在其中使用 Protobuf(由于它的优点)。我会有一个通用的标题消息如下

现在这条消息理想情况下会被应用程序消息继承并编写自己的消息。应用程序消息的伪代码将是

现在实现如下

理想情况下,当我收到消息时,我只会得到 Application class proto(内部继承 Header),它的 proto 定义不会出现在我身上,因为不同的应用程序会有自己的 proto。服务器应用程序将只有标头的原始消息,它应该根据“进程名称”读取并重定向到服务器上运行的不同进程。

另一个考虑因素是不同的进程在 c# 中但在 Python 中是耦合的。我看到了 protobuf-csharp-port 和 Protbuf-net 版本(由不同的人编写),并且了解到对于涉及的各种编程语言,使用 csharp-port 比使用 Protobuf-net 版本更好。

我在 Stackoverflow 和网上进行了很多搜索,但我无法找到从应用程序消息中获取 Header 信息的解决方案,而不知道 Application 消息原型(我只知道由应用程序继承的 Header proto)。

0 投票
1 回答
2222 浏览

c# - 使用 Google Protobuf proto2 文件生成 C# 代码

我有几个具有 proto2 语法的 .proto 文件。我正在尝试使用 protoc 编译器自动生成 C# 类,但出现错误:“C# 代码生成仅支持 proto3 语法。

除了手动更新每个 .proto 文件以符合 proto3 语法之外,没有其他方法可以自动生成 C# 类吗?我对 protobuf 完全陌生,所以我知道这听起来像是一个奇怪的问题,因为编译器明确指出我必须遵循 proto3 语法 - 我只是想知道是否有解决方法让 C# 类与 proto2 一起工作句法。

0 投票
1 回答
443 浏览

c# - 使用旧版 Google Protobuf 创建对象

我最初使用 Google Protobuf 3.1 protoc 编译器来自动生成 Filepath.cs 类。因为 filepath.proto 文件是为 proto2 语法编写的,所以我不得不手动更改文件以适应 proto3。

事实证明,出于我无法控制的原因,我需要坚持使用 proto2 语法。我发现 protoc 版本 3.0.0alpha3 支持 proto2 文件的 C# 代码生成(较新的 protoc 版本不支持 proto2 文件的 c# 代码生成,这就是我恢复到 alpha 3 的原因)。

生成的代码不同,我之前存在的代码(最初与 protoc 3.1 一起工作,不再工作):

这段代码不再适用于 alpha3 生成的文件。有谁知道如何使用旧版本的 Protobuf 正确序列化/反序列化对象,或者旧教程是否存档在某个地方?

我能够做到:

这些领域只有吸气剂,没有二传手PathTestValue

0 投票
0 回答
341 浏览

c# - 如何从 Google.Protobuf C# 中的池中分配复合对象

我在 C# 中使用 Google.Protobuf 3.2.0 实现。我试图让它从池中分配对象。这样做的原因是它们需要通过队列传递给另一个线程进行处理,并且我希望我的应用程序在稳定运行状态下是无垃圾的

对于一个简单的对象来说,这很容易。

例如,使用以下 proto 文件:

我可以实现一个自定义解析器:

每次它需要一个新对象时它都会调用委托,所以我可以实现一个池。

但是如何为具有嵌套成员的复合对象执行此操作?

我可以为 CompoundMessage 创建顶级自定义解析器,但是如何更改它用于创建嵌套对象的解析器(或工厂)?

0 投票
1 回答
810 浏览

protobuf-net - Protobuf 异常 - 对象引用未设置为对象的实例

我正在尝试使用 protobuf 序列化我的下面的类,但它因“对象引用”错误而失败。更多细节如下。知道通过查看错误详细信息可能会出现什么问题吗?注意:我的用户对象太大,它有很多子对象和属性。所以不要在这里添加用户类的详细信息。

以下是错误详细信息:

例外: {“对象引用未设置为对象的实例。”}

Inner StrackTrace: 在 ProtoBuf.Serializers.TagDecorator.get_ExpectedType() 在 ProtoBuf.Serializers.DefaultValueDecorator..ctor(TypeModel model, Object defaultValue, IProtoSerializer tail) 在 ProtoBuf.Serializers.MapDecorator`3..ctor(TypeModel model, Type concreteType, IProtoSerializer keyTail, IProtoSerializer valueTail, Int32 fieldNumber, WireType wireType, WireType keyWireType, WireType valueWireType, Boolean overwriteList)

外部堆栈跟踪:在 System.RuntimeMethodHandle.InvokeMethod(对象目标,Object[] 参数,签名 sig,布尔构造函数)在 System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr,Binder binder,Object[] 参数,CultureInfo 文化)在 System.Reflection.ConstructorInfo .Invoke(Object[] parameters) at ProtoBuf.Meta.ValueMember.BuildSerializer() at ProtoBuf.Meta.ValueMember.get_Serializer() at ProtoBuf.Meta.MetaType.BuildSerializer() at ProtoBuf.Meta.Meta.MetaType.get_Serializer() at ProtoBuf .Meta.RuntimeTypeModel.Serialize(Int32 key, Object value, ProtoWriter dest) at ProtoBuf.Meta.TypeModel.SerializeCore(ProtoWriter writer, Object value) at ProtoBuf.Meta.TypeModel.Serialize(Stream dest, Object value, SerializationContext context) at ProtoBuf.Serializer 中的 ProtoBuf.Meta.TypeModel.Serialize(Stream dest, Object value)。序列化[T](流目的地,T 实例)

此问题仅适用于最新的 nuget 版本 2.3.0。当我使用 2.0.0.668 版本时,它工作正常。

0 投票
1 回答
520 浏览

azure-service-fabric - ProtoBuf - Azure 服务结构

我正在考虑替换 ASF 中 RPC 的默认序列化程序。这涉及实现一些接口,其中一个在通过 RPC 通信的服务之间传递

由于实现需要可序列化,明显的 ProtoBuf 实现类似于

不幸的是,这失败了

没有为类型定义序列化程序:System.Object

这里有解决方法吗?System.Object 没有合同,但 OOTBDataContract序列化程序可以,这里的MessagePack 也可以,但是这些不是模式化的,这在使用可靠集合时会产生版本控制问题。我尝试过使用通用的基本类型,但 Value 可以是or等​​等。IEnumerable<T>T

任何人都可以帮忙吗?谢谢,KH

0 投票
1 回答
1276 浏览

uwp - Google.Protobuf 是否支持 .NET Core?

我通过查看Google.Protobuf Git知道有一些关于 .NET Core 支持的评论,但是当我从 Git 获得源代码的副本时,Google.Protobuf 项目在依赖项中列出了 .NetFramework 4.5 和 .NetStandard 1.0 .

csharp 文件夹中的 Google.Protobuf Git Depot 上,有一些关于 .NET Core 支持的进一步评论。

此外,通过查看附加到 Depot 的问题跟踪器,我在大约一年前遇到了这个关于让 Google.Protobuf 与 .NET Core 配合使用的线程。

谁能给我一个关于 Google.Protobuf 是否支持 .NET Core 的明确答案?

0 投票
1 回答
1628 浏览

protocol-buffers - 哪个版本的 Google.Protobuf 适合 .netframework 4.0?

当我安装从 3.0.0 到 3.5.1 的版本时,错误消息如下:

安装包:无法安装包“Google.Protobuf 3.5.1”。您正在尝试将此包安装到以“.NETFramework,Version=v4.0”为目标的项目中,但该包不包含任何与该框架兼容的程序集引用或内容文件。有关详细信息,请联系包作者。在 line:1 char:1 + Install-Package Google.Protobuf -Version 3.5.1 -Project HDExamine + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [Install-Package ], InvalidOperationException + FullyQualifiedErrorId : NuGetCmdletUnhandledException,NuGet.PowerShell.Commands.InstallPackageCommand

然后我参考了nuget包站点,它的依赖项包括NETStandard.Library(>= 1.6.1),在我成功安装NETStandard.Library 2.0.1之后,但是错误信息仍然相同。

我的应用程序基于 .net framework 4.0,想知道我可以使用哪个版本的 Google.Protobuf,非常感谢您的帮助。

0 投票
2 回答
5247 浏览

protocol-buffers - 带有一些字符串的 Protobuf InvalidProtocolBufferException

我们使用 protobuf v.3 通过 HTTP 将消息从 C# 客户端传输到 Java 服务器。

消息原型如下所示:

客户端和服务器都对字符串使用 UTF-8 字符编码。

当我们使用像“abc”这样的短字符串值时一切都很好,但是当我们尝试传输包含 198 个字符的字符串时,我们会发现一个异常:

我们尝试比较包含 protobuf 数据的偶数字节数组,但没有找到解决方案。对于“aaa”字符串字节数组以这个字节开头:

10 3 97 97 97

其中 10 是 protobuf 字段编号,3 是字符串长度,69 65 67 是“aaa”。

对于字符串

“啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊”

其中包含 198 个字符,字节数组以此开头:

其中 10 是 protobuf 字段号,198 是字符串长度,1 似乎是字符串标识符,还是什么?

以及为什么 protobuf 无法解析此消息?

已经花了将近一天的时间来寻找这个问题的解决方案,任何帮助表示赞赏。

更新:

我们从客户端和服务器都进行了转储,但奇怪的是 - 转储是不同的!

在发送到服务器之前,从客户端转储 Protobuf:

服务器接收的 Protobuf 转储:

正如你所看到的,protobuf 数据头是不同的......这完全打破了我的想法,怎么会发生这种情况?

UPDATE2:我们进行了一项研究,发现此问题仅发生在长度超过 128 个符号的字符串中。如果字符串由 128 个或更少的符号组成 - 没有问题。