Tag: 协议缓冲区

运行时生成的协议缓冲区对象

我的一位同事提出了在运行时生成协议缓冲类的想法。 含义: 有C ++服务器应用程序和Java客户端应用程序通过TCP / IP通过协议缓冲区消息进行通信。 C ++应用程序在不同版本中可能具有不同的模式,这不一定是向后兼容的 Java应用程序与此服务器通信,应该支持所有可能的服务器版本。 这个想法是服务器将协议缓冲区的定义作为初始握手的一部分发送,java应用程序在运行时生成类并使用它与服务器进行通信。 我想知道这是否是至关重要的想法,如果这种用例可能有一些实用性。 谢谢

如何转换Json至Protobuf?

我是新手使用protobuf,并想知道是否有一种简单的方法将json流/字符串转换为Java中的protobuf流/字符串? 例如, protoString = convertToProto(jsonString) 我有一个json字符串,我想解析为protobuf消息。 所以,我想首先将json字符串转换为protobuf,然后在其上调用Message.parseFrom() 。 在此先感谢您的帮助!

用gradle简单的protobuf编译

如果您正在寻找示例gradle protobuf项目,请查看此处 。 我很难使用gradle和protobuf,我想创建一个简单的gradle项目,它将从默认的src/main/proto , src/test/proto获取任何proto文件,并将它们编译为src/main/java , src/test/java ,然后将其打包到jar中并发布到本地repo。 不幸的是,我是新手,无法弄清楚原始项目的组成方式。 这是我未完成的build.gradle文件 apply plugin: ‘java’ apply plugin: “com.google.protobuf” buildscript { repositories { mavenCentral() } dependencies { classpath ‘com.google.protobuf:protobuf-gradle-plugin:0.7.0’ } } repositories { mavenCentral() } dependencies { compile ‘com.google.protobuf:protobuf-java:3.0.0-beta-1’ } sourceSets { main { proto { srcDir ‘src/main/proto’ } java { srcDir ‘src/main/java’ } } test { […]

Google Protobuf ByteString vs. Byte

我正在使用Java中的google protobuf。 我看到可以将protobuf消息序列化为String,byte [],ByteString等:(来源: https : //developers.google.com/protocol-buffers/docs/reference/java/com/google/protobuf / MessageLite ) 我不知道ByteString是什么。 我从protobuf API文档中获得了以下定义(来源: https : //developers.google.com/protocol-buffers/docs/reference/java/com/google/protobuf/ByteString ):“不可变的字节序列。子串与String一样,通过共享对不可变底层字节的引用来支持。“ 我不清楚ByteString如何与String或byte []不同。 有人可以解释一下吗? 谢谢。

Java:JSON – > Protobuf和后向转换

我有一个现有的系统,它在GUI和服务器之间使用基于protobuf的通信协议。 现在我想添加一些持久性,但目前protobuf消息直接转换为第三方自定义对象。 有没有办法将原型消息转换为json ,然后可以将其保存到数据库。 注意:我不太喜欢将二进制protobuf写入数据库的想法,因为它有一天会变得不能与新版本向后兼容并以这种方式破坏系统。

在Maven项目之间导入协议缓冲区定义

我目前管理一些单独的Maven项目,其中我使用Protobufs作为序列化格式并通过线路。 我正在使用David Trott的maven-protoc插件在编译时生成代码。 一切都很好,直到我希望这些项目彼此之间进行通信 – 或者更确切地说,使用彼此的protobufs。 protobuf语言有一个“导入”指令,它可以满足我的需要,但是我面临的挑战是让项目A导出一个“.proto”文件(或者可能是一些中间格式?),以供项目B依赖。 Maven提供了一种项目捆绑资源的方法,但是AFAIK,这些是在运行时由代码而不是在编译/源代码生成阶段的目标使用 – 至少我找不到描述的文档我想要实现的目标。

在java协议缓冲区中导入“google / protobuf / descriptor.proto”

我有一个.proto文件定义,需要导入”google/protobuf/descriptor.proto”因为我使用自定义选项 。 所以在我的.proto文件中我做了: import “google/protobuf/descriptor.proto”; package …; … 由于我的文件没有编译抱怨依赖,我得到了descriptor.proto文件的副本,将它放在我的proto文件所在的目录中。 这解决了问题,但我不相信这是正确的方法。 现在, descriptor.proto与我的.proto文件一起编译,导致在运行时有2个编译的descriptor.proto : 与protobuf-java-2.5.0.jar文件一起提供的protobuf-java-2.5.0.jar 与我的.proto文件一起编译的.proto 我认为应该以某种方式使用–proto-path选项,但不完全确定什么是正确的方法。 感谢您的最佳实践提示!

如何根据给定的.proto编写有效的解码文件,从.pb读取

根据这个问题的答案,我认为我已经为我的.pb文件提供了“错误的解码器”。 这是我正在尝试解码的数据 。 这是我的.proto文件 。 基于Java教程文档中提供的ListPeople.java示例,我尝试编写类似于开始挑选数据的东西,我写道: import cc.refectorie.proj.relation.protobuf.DocumentProtos.Document; import cc.refectorie.proj.relation.protobuf.DocumentProtos.Document.Sentence; import java.io.FileInputStream; import java.io.IOException; import java.io.PrintStream; public class ListDocument { // Iterates though all people in the AddressBook and prints info about them. static void Print(Document document) { for ( Sentence sentence: document.getSentencesList() ) { for(int i=0; i < sentence.getTokensCount(); i++) { System.out.println(" getTokens(" + […]

使用带有java和scala的protobufs的问题

我有一个文件xxx.proto 。 我下载了protobuf编译器并安装了它。 然后我发出了这个命令 protoc –java_out=./ xxx.proto 它生成了我的xxx.java 现在我想将这个文件编译成一个类文件,我可以使用它与Scala。 javac xxx.java 这给了我这个错误 xxx.java:7: package com.google.protobuf does not exist com.google.protobuf.ExtensionRegistry registry) { ^ xxx.java:12450: package com.google.protobuf.Descriptors does not exist private static com.google.protobuf.Descriptors.Descriptor ^ xxx.java:12453: package com.google.protobuf.GeneratedMessage does not exist com.google.protobuf.GeneratedMessage.FieldAccessorTable … … … 100 errors 现在我猜,它没有包。 因此,我将com.google.protobuf包的类文件复制到xxx.java所在的同一文件夹中。 注意 – 我没有编译这个包。 我从另一个包含jar文件的扩展中下载了jar。 所以我提取了它们。 现在我xxx.java所在的当前路径有protobuf库的com / google / […]

使用protobuf序列化时出错

我正在尝试使用protobuf序列化结构。 经过几个小时试图弄清楚我做错了什么我决定测试一下google的例子,但是效果并不好 我有以下谷歌协议( https://developers.google.com/protocol-buffers/docs/javatutorial ): package tutorial; option java_package = “com.example.tutorial”; option java_outer_classname = “AddressBookProtos”; message Person { required string name = 1; required int32 id = 2; optional string email = 3; repeated PhoneNumber phone = 4; enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber { required […]