问题标签 [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.
java - 协议缓冲区和枚举组合?
这是我的原型文件:
在我的 C# 中,我试图:
但是 JAVA 告诉我:缺少 MsgCode(这是一个required
)
删除组合 -确实解决了
但我需要指定组合
问题
我该如何解决?
注意:
奇怪的是,如果我创建一个msg
并设置多个 enums ,然后再次在 C# 中读取它 - 它确实有效......:-(
c# - 替代 Protobuf 的大小
我最近接受了一项任务,建议使用 Protobuf 序列化要写为 base64 字符串的对象。这将是 .NET 端口的 protobuf-net。存储此数据的先前方法是一系列位掩码,但已经过时,这是建议的路线。不幸的是,这种方法写出的数据对于我的目的来说太大了。
在代码中,我正在序列化的对象如下所示。我已经尝试过使用装饰过的 POCO 和 ProtoGen 生成的类。ProtoGen 生成的类实际上被序列化为优化程度较低的数据。
查看输出和大小随着列表长度的增长而增长的方式,我认为一些大小来自存储有关类类型的类型信息。我试图看看如何将这些对存储在并行数组中并使用“打包”,但是我没有看到尺寸上有太大的改进。也许是 10%-15%。就目前而言,这比以前的数据存储方法大一个数量级,但是由于我们的密钥空间用完了,旧方法将无法工作。
我的问题是,除了通过在旧方法中添加更多位来简单地扩大密钥空间之外,还有没有办法优化 Protobuf 的大小,我可能会丢失?或者也许是序列化针对大小优化的相当简单的对象的替代方法?
我还没有尝试过,但从我正在阅读的内容来看,即使对当前数据进行 GZipping 也只会带来边际改进。接下来我将把它作为一个选项。
示例类:
c# - 是否可以在 protobuf-csharp-port 中检测消息类型?
java客户端根据这个骨架构造一个消息:
此消息被发送到 C# 程序(服务器端)。
服务器知道如何读取字节(第一个字节是要读取的字节数,代表以下消息的大小)。
这就是由字节数组构造 MSG 的方式。
其中 buffer 是从套接字读取的字节数组。
但是现在我处于客户端需要发送“心跳”消息( 另一条消息)以检查服务器是否处于活动状态的情况。(服务器应该响应:“是的,我还活着”)
当然,我可以在MSG
课程中添加另一个字段。但我不想这样做,因为MSG
该类有很多不必要的字段 - 对于 Heartbeat 操作。
问题 :
服务器读取 n 个字节。无论如何我可以知道这是一条MSG
消息还是“心跳”消息?
json - .Net 协议缓冲区到 JSON,JsonFormatReader 类不处理最外面的花括号?
我正在使用 Google 协议缓冲区,使用 protobuf-csharp-port 库(https://code.google.com/p/protobuf-csharp-port/)。Google.ProtocolBuffers.Serialization 类有一个JsonFormatReader
/JsonFormatWriter
类,当我使用它们时,它们不会将开始和结束的花括号放置到 JSON 文档中,如果我添加开始和结束大括号,它们也无法读取他们编写的相同文档。
所以例如调用
创建:
如果我尝试解析
使用
我得到以下信息:
为什么缺少 { },这是有效的 JSON 吗?
c# - 有没有办法将 protobuf-csharp-port 生成的类与 servicestack.ormlite 一起使用?
我有大量使用 protobuf-csharp-port 生成的 C# 类。我最终为他们创建了自己的简单 ORM 机制。
原来 OrmLite 正是我想要的。但我现在“卡住”了 protobuf 类。最大的问题是,对于每个实体,我有两个类:EntityClass(只读)和 EntityClass.Builder。
有没有办法集成 OrmLite 和 protobuf-csharp-port 类(及其构建器)?
java - 为 C# 和 Java 编译 protobuf
对于 C# 文件的编译,我们所有的 .proto 文件都包含如下行:
我也想为 java 使用这些 proto 文件(我有必要的 java_package 选项集),但是如果我编译我会得到各种各样的错误。删除这个 csharp 东西可以很好地编译 Java。
无论如何我可以使用相同的文件为 C# 和 Java 编译吗?
使用 proto2、protoc 2.5 和 protobuf-java 2.5
编辑:这是一些 Java 编译错误:
EDIT2:构建过程只是一个运行这个的脚本:
EDIT3:这是一个简单的例子。这是我的目录结构:
csharp_options.proto 和描述符可以在这里找到。
这是 Contact.proto 的内容:
执行 protoc 脚本后(参见编辑 2),它会创建以下内容:
目前我只是使用 Eclipse 进行编译。(还没有行家)。在 Eclipse 中,它报告以下编译器错误:
这是有问题的代码:
如您所见,它期望 CsharpOptions 存在,但事实并非如此。
c# - 如何跨 WCF 方法调用发送 Protobuf?
我已经.proto
使用 protobuf-csharp-port 运行时编写并编译了一些文件,并且我试图返回一个作为对 WCF 方法调用的响应。这是我的服务:
但这会失败,并显示无用的“服务器未提供有意义的回复”错误消息。
对另一个问题的回答表明,这可能是序列化程序爆炸而不提供错误消息,所以我尝试将合同更改为string
:
这很好用,所以它一定与 Protobuf 有关。
我的假设是 WCF 由于某种原因无法序列化 Protobuf。我见过很多人在写[DataContract]
,但这似乎只与 相关protobuf-net
,但我找不到任何关于 的信息protobuf-csharp-port
,这似乎并没有以[DataContract]
完全相同的方式使用。我尝试将-code_contracts
Protogen 的选项设置为,true
但这并不能解决任何问题(它甚至可能不相关)。
那么:如何从 WCF 方法调用中返回 Protobuf 对象?显然我可以手动反序列化 Protobufs,但这会变得乏味,所以我希望 WCF 为我做这件事。
请注意,我并不是想用 Protobuf替换WCF 序列化;我只想从 WCF 方法调用中返回一个 Protobuf 对象。
编辑#1:我DataContractSerializer
手动设置了一个并尝试序列化一个 Protobuf。我收到一个错误,上面写着Type 'Protobuf.LogEntry' cannot be serialized. Consider marking it with the DataContractAttribute attribute, and marking all of its members you want serialized with the DataMember attribute.
很明显,我不能这样做,因为代码是自动生成的。那么:如何使用 ProtoGen 或其他方式添加适当的属性?
c# - 用于 C# 的 Google Protobuf 3.0.0 程序集
在我们的项目中,我们成功地将 Google Protobuf 用于 C++。现在需要编译相同的 *.proto 文件以在 C# 代码中使用它。我下载了最新的Protobuf 版本 3.0.0-alpha-3。它为 C# 提供了对 proto2 格式的支持,这对我来说已经足够了。我可以成功构建我的 *.proto 文件并获得一个 *.cs 文件。但是,当我将生成的 *.cs 文件添加到我的 C# 项目并尝试构建时,我收到如下编译器错误:"The type or namespace name 'Google' could not be found in the global namespace (are you missing an assembly reference?)"
这是发生错误的地方:
现在我在项目页面上可用的发布 ZIP 中找不到任何 DLL 等,我可以将其作为参考包含在我的 C# 项目中。只有 protoc.exe 和一些 *.proto 文件在那里。我的简单问题是:我从哪里获得这些程序集?
(备注:我尝试按照自述文件中的说明从源代码构建项目protobuf-csharp-3.0.0-alpha-3,但未能使用“开箱即用”的 Visual Studio 2013 Update 4 构建它;我得到了许多编译器错误。)
c++ - 使用 C++ 检查并将数据添加到 protobuff
我想添加基于的数据HealthID
;如果HealthID
已输入,则程序不应添加新条目,而应仅增加现有条目的OccCount
.
这段代码是正确的还是我应该转换HealthID
成字符串?
生成的代码:
javascript - 如何在 Protobuf.js 中转换为十进制类型
我想用 和 中的窗口应用程序交换网站protobuf.net
数据protobuf.js
。我有一个protobuf.js
没有十进制类型的问题。请帮我。