目前,我要重写一个简单的代码从Python到PHP. 此代码用于使用Protobuf和grpc向Yandex Cloud(语音套件)的请求. 在python(v3)上一切都很好. 然后,我想要PHP中的相同(MacOS上的7.1.23). 我使用protoc编译Protobuf和GRPC PHP插件来获取服务客户端. 我面临的第一个复杂性是客户端的方法界面是SttServiceClient->StreamingRecognize(array metadata[], array options=[]),这很困惑,因为我认为应该接受StreamingRecognitionRequest. . 第二个是我得到异常无效的exception:bad Metadata值给定: PHP Fatal error: Uncaught InvalidArgumentException: Bad metadata value given in /Users/cyberpug/Do
以下是关于 protocol-buffers 的编程技术问答
我在项目中编译了自己的原始库夫(在主要目标中,而不是lib中),但是我发现崩溃是由libprotobuf.dylib中的protobuf代码引起的(在我的猜测中是新的lib in new new new设备的版本 - 我的是iPad Air). * thread #1: tid = 0x6598, 0x0027e96e TutorChat`void google::protobuf::internal::RepeatedPtrFieldBase::Destroy::TypeHandler>(this=0x1567158c) + 66 at repeated_field.h:814, queue = 'com.apple.main-thread, stop reason = breakpoint 2.41 frame #0: 0x
我有一个现有系统,该系统正在使用GUI和服务器之间的基于Protobuf的通信协议.现在,我想添加一些持久性,但是目前,Protobuf消息是直接转换为第三方自定义对象的. 是否可以将 proto 消息转换为 json ,然后可以将其持续到数据库. n.b.:我不太喜欢将二进制Protobuf写入数据库的想法,因为它可以有一天与较新版本并不反向兼容并以这种方式打破系统. 解决方案 如一个类似问题的答案 github.com/google/protobuf/releases/tag/v3.1.0" rel =" noreferrer"> v3.1.0 这是协议案件的支持功能.对于java,包括扩展模块JsonFormat.parser().ignoringUnknownFields().merge(json, yourObjectBuilder); YourObject value = yourObjectBuilder.build(); 其他解决方案 我们当前
我编写了JMH基准测试,以比较Java 1.8中AVRO(1.8.2)和Protobuf(3.5.0)的序列化性能.根据JMH的说法,Protobuf可以在一秒钟内序列化一些数据470万次,因为Avro只能每秒进行800k. 序列化的测试数据约为200个字节,我为Avro和Protobuf生成了模式. 这是我的AVRO序列化代码,熟悉Avro的人可以确保我没有犯一些主要的错误吗? 称为序列化的方法是JMH基准测试的方法.另外,我已经在 https://groups.google.com/论坛/#!主题/protobuf/skme78f-xbe 非常感谢 public final class AvroSerialization{ private BinartEncoder encoder; private final SpecificDatumWriter writer; public AvroSerialization( ){
有没有这些图书馆经验的人对他们更喜欢哪一个的评论?使用的性能差异或困难吗? 解决方案 我在两个系统中都玩过一些,没有什么严重的,只是一些简单的黑客东西,但是我觉得您应该如何使用库有一个真正的区别. 使用boost ::序列化,您首先编写自己的结构/类,然后添加归档方法,但是您仍然留下一些漂亮的"苗条"类,可以用作数据成员,无论如何, . 使用协议缓冲区,即使是简单结构生成的代码量非常重要,并且生成的结构和代码更适合于操作,并且您使用协议缓冲区的功能将数据传输到您的自己的内部结构. 其他解决方案 我已经使用了Boost Serialization很长时间了,只是挖掘了协议缓冲区,我认为它们的目的不是完全相同的目的. BS(没有看到即将到来)将您的C ++对象保存到流中,而PB是您读取的互换格式. PB的数据模型更简单:您可以获得各种INT和浮子,字符串,数组,基本结构,这几乎就是这样. BS允许您在一个步骤中直接保存所有对象. 这意味着使用BS,您可
我们正在研究运输/协议解决方案,并正在进行各种绩效测试,所以我想我是否已经与社区联系了: 是否有人为简单的回声服务进行了服务器性能测试,以及用于比较Linux上EJB3,Thrift和协议缓冲区的各种消息大小的序列化/避难所化? 主要是语言是Java,C/C ++,Python和Php. 更新:如果有人做了进一步的基准,我仍然对此非常感兴趣,请告诉我.另外,非常有趣的基准测试显示压缩JSON的执行/比节俭/协议缓冲区相似/更好,因此我也将JSON投入到这个问题中. 解决方案 最新比较可在 thrift-protobuf-compare 项目Wiki.它包括许多其他序列化库. 其他解决方案 我正在开源源名为Thrift Protobuf-Compare的项目 Protobuf和Thrift之间的比较.目前,它涵盖了一些序列化方面,但我打算涵盖更多.结果(对于节俭和 protobuf )在我的博客中讨论,当我将获得它时,我会添加更多. 您可以查看以比较API
我正在构建一个分布式的C ++应用程序,需要进行大量的序列化和对正在不同过程和计算机之间传递的简单数据结构的序列化. 我对序列化复杂类层次结构不感兴趣,但是更多地发送了一些简单成员,例如数字,字符串和数据向量.数据向量通常很大. 我担心基于文本/XML的方法太慢了,我真的不想自己写这篇文字,因为诸如字符串编码和数字eNdianess之类的问题比表面上看起来更复杂. 我一直在寻找协议缓冲区并升级.根据文档,协议缓冲区似乎非常关心性能. 从某种意义上说,Boost似乎更轻巧,您没有外部语言来指定我对此特定项目非常方便的数据格式. 所以我的问题归结为:有人知道上面描述的典型用例是否快速序列化? 另外,如果还有其他可能适合此的库,我很高兴听到有关它们的消息. 解决方案 我强烈建议协议缓冲区.它们非常易于使用,提供出色的性能,并照顾诸如Endianness和向后兼容的问题.为了使其更具吸引力,由于多种语言实现,序列化数据是独立于语言的. 其他解决方案 王牌和王牌
我试图通过以下文件夹结构导入原始原始原型. | |--parent.proto | |--sub |--child.proto parent.proto message Attribute { --- } child.proto import "parent.proto" message Child { int32 attributeNo = 1; com.model.Attribute attribute = 2; } 目前,这给我带来了错误,说它找不到parent.proto. 请建议. 解决方案 protoc在使用-I标志指定的目录中寻找其导入.例如,您可以将-I/home/user/my_awesome_proto_lib添加到protoc命令行args,并且编译器会在此处寻找您的导入. 从Protoc的帮助页面上,关于--proto_path: -IPATH, --pr
我尝试将名为test1.proto的原始文件导入到名为test2.proto的另一个import语句 的原始文件. import "com/test/test1.proto"; 但是我得到以下错误 com/test/test1.proto: File not found. test2.proto: Import "com/test/test1.proto" was not found or had errors. 我尝试以多种方式找到导入错误的原因,但不能.因此,有人可以告诉我正确执行原始文件导入的方式,以防上述语句出现问题? 解决方案 您必须使用--proto_path命令线标志(aka -I)来告诉protoc在哪里查找.proto文件.如果您不提供路径,默认情况下,它将仅搜索当前目录.请参阅文档(在"生成您的类"结束时,页面),或键入protoc --help. 其他解决方案 只是要添加,如果您要为.NET构建和/或您是Visual Studio,
我有一个程序,可以通过在字节[]数组中编写二进制数据,然后将其保存在" .txt"文件中,从而通过Java中的Protobuf序列化数据.我在弦线中收到C ++侧的数据.现在,我想用C ++解析该二进制数据,但是ProtoBuf-parsing-method" Parsefromstring()"不起作用!未设置我的测试消息中的字段.我为此写了一些测试,可以向您展示一些代码: java序列化 byte[] s = test.build().toByteArray(); //This is serialized to "C:\test.txt" as binary C ++解析: Test t1; // My Protobuf Message std::ifstream myFile("C:\\test.txt"); std::string s; myFile >> s; t1.ParseFromString(s); std::cout
我知道协议 - 缓冲器是一种序列化格式,需要在.proto中使用消息格式才能正确读取.但是我有一个我不知道适当的消息格式的文件,因为它没有发布.我要做的是自己逆转数据,以便我可以重建消息.为此,我需要读取可以在其中拾取字段编号,类型和值的原始文件. 是否有一个程序可以执行此操作(可以在Python中,但C/C ++也很酷)? 解决方案 进行了一些挖掘后,我写了自己的工具来做到这一点.我敢肯定,还有其他方法可以做到这一点,但是此工具查看了源二进制中的描述.它在描述流中读取并吐出pseudo-.proto文件.由此,您可以编译自己的PB文件并解码流. import sys import struct # Helper functions ------------------------------------------------------------ # this comes largely straight out of the google protocol-
ParseFromString在Java中可用于协议缓冲器? C ++版本具有: 解决方案 bool TextFormat::Parser::Parse(io::ZeroCopyInputStream* input, Message* output) { output->Clear(); return Merge(input, output); } bool TextFormat::Parser::ParseFromString(const string& input, Message* output) { io::ArrayInputStream input_stream(input.data(), input.size()); return Parse(&input_stream, output); } 您可以看到Parse只需清除消息,然后调用Merge.尽管Java的实现协议缓冲区没有Parse方法,但您可以轻松地实现它: public static void
i从Google Pub/sub获取ProtoBuf数据,并将数据验证为消息类型对象.因此,我得到PCollection键入对象.这是示例代码: public class ProcessPubsubMessage extends DoFn { @ProcessElement public void processElement(@Element PubsubMessage element, OutputReceiver receiver) { byte[] payload = element.getPayload(); try { Message message = Message.parseFrom(payload); receiver.output(message); } catc
我想用Apache Spark读取/编写来自/到HDF的协议缓冲消息.我找到了这些建议的方法: 1)使用Google的GSON库将Protobuf Messages转换为JSON,然后由SparkSQL读/写.该解决方案在 2)转换为镶木文件.有 parquet-mr 和 sparksql-protobuf github project for thise for t y this of diship of parquet文件,因为我总是与所有人一起工作列(不是某些列),以这种方式,镶木格式不会给我任何收益(至少我认为). 3) scalapb .可能是我想要的.但是用Scala语言,我对此一无所知.我正在寻找基于Java的解决方案. 这个YouTube视频介绍Scalapb并解释如何使用它(Scala Developers). p> 4)通过使用序列文件,这就是我想要的,但没有发现.因此,我的问题是:如何编写Protobuf消息以在HDFS上进行序列文件?任何其他建议都将
GSON的协议缓冲区(Protobuf)的利弊是什么? 在什么情况下,Protobuf比Gson更合适? 我很抱歉一个非常通用的问题. 解决方案 JSON(通过GSON库)和Protobuf均可移植在Platorms之间.但是 Protobuf较小(带宽)和更便宜(CPU)读/写 JSON是人类可读/可编辑(Protobuf是二进制的;如果没有图书馆支持,很难解析) Protobuf是微不足道的合并片段 - 仅串联 JSON轻松传递给网页客户端 Protobuf的主要Java版本需要合同定义(.proto)和代码生成; GSON似乎允许任意使用POJO使用(Protobuf实现了此类对象,但对Java Afaik不起作用) 如果性能是关键:fartubuf 用于与网页(JavaScript)或人类可读:JSON(也许通过GSON) 其他解决方案 如果您需要效率和跨平台,则应在包含必要信息的应用程序之间发送原始消息,而无需或多或少.
我正面临一个问题,看来Visual Studio正在改变对象在.proto文件中的外观. .. proto文件: concordium_p2p_rpc.proto 示例 - 这在.proto文件中: message BlockHash { string block_hash = 1; } 构建我的项目后,我想创建一个确切对象的实例,但是,该对象内的属性现在称为" blockhash_",而不是" block_hash",如.proto文件中的" block_hash". 如果我尝试将此对象序列化为JSON ...那么属性现在称为" blochhash" ...一个三个名称. so in .proto { "block_hash": "" } 进入C# BlockHash bh = new BlockHash() { BlockHash_: "" } ,然后序列化 { "blockHash": "" }
我一直在尝试使用 grpcurl 在客户侧流中上载图像.该服务的运行无错误,除非在服务器上,收到的图像数据为0字节. 我使用的命令是: grpcurl -proto image_service.proto -v -d @ -plaintext localhost:3010 imageservice.imageservice.uploadimage {"chunk_data": ""} this 正是我要实现的目标,但是使用 grpcurl . 请告诉我的命令中有什么问题,以及通过 grpcurl . 实现流式传输的最佳方法是什么. 我还有两个问题: GRPC是否将数据分解为块? 如何首先发送元数据块(ImageInfo类型),然后通过GRPCURL? 进行实际图像数据 这是我的原始文件: syntax = "proto3"; package imageservice; import "goog