天道酬勤,学无止境

How to use protobuf message as java class without a java outer class?

I want to generate java class with My.proto:

package com.my.test;

option java_package = "com.my.test";

message MyError {
  optional string value = 11;
  optional string name = 12;
}

message MyRequest {
  optional string myid = 1;
  optional string yourid = 2;
}

After use protoc --java_out=./ My.proto, there will be: com.my.test.My.java

package com.my.test;

public class My {
  public static class MyError {}
  public static class MyRequest {}
}

How could I generate java class like:

package com.my.test;
public class MyError {}

and

package com.my.test;
public class MyRequest {}

评论

Instead of trying to generate classes without an outer class, you can import the inner classes:

import com.my.test.My.MyError;
import com.my.test.My.MyRequest;

Alternatively, if you are using proto3:

syntax = "proto3";
option java_multiple_files = true;

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何知道字节数组是哪个protobuf消息?(How to know which protobuf message the byte array is?)
    问题 我想使用 protobuf 而不是 Json 在消息队列之间进行通信。 当只有一个 proto 消息时,我知道如何处理它。 假设 proto 文件是: //person.proto syntax = "proto3"; option java_outer_classname = "PersonProto"; message Person { int32 id = 2; string name = 1; string email = 3; } 现在,我可以用下面的方法来处理它: PersonProto.Person person = PersonProto.Person.newBuilder() .setEmail("123@test.com") .setId(1) .setName("name-test") .build(); byte[] bytes = person.toByteArray(); //Transfer from publisher to consumer between message queue. //I can deserialise it, because i know the proto message is Person. PersonProto.Person.parseFrom(bytes); 但是如果有多个 proto 消息怎么办?
  • Android Protobuf Nano文档(Android protobuf nano documentation)
    问题 我正在尝试减少Google pro-buf生成的方法的数量,替代方法之一是使用pro-buf nano。 但是我没有找到有关如何使用它的文档。 除了包链接外,我找不到任何有关如何使用nano从原始文件生成Java文件的信息。 因此,问题很简单:如何使用Google Proto Nano以便从Proto文件生成Java类以及如何在项目中使用它们? 回答1 查看主要的protobuf编译器源代码: #include <google/protobuf/compiler/javanano/javanano_generator.h> .... int main(int argc, char* argv[]) { google::protobuf::compiler::CommandLineInterface cli; cli.AllowPlugins("protoc-"); ... // Proto2 JavaNano google::protobuf::compiler::javanano::JavaNanoGenerator javanano_generator; cli.RegisterGenerator("--javanano_out", &javanano_generator, "Generate Java source file nano runtime.")
  • gRPC快速入门(一)——Protobuf简介
    gRPC快速入门(一)——Protobuf简介 一、Protobuf简介 1、Protobuf简介 Protobuf即Protocol Buffers,是Google公司开发的一种跨语言和平台的序列化数据结构的方式,是一个灵活的、高效的用于序列化数据的协议。与XML和JSON格式相比,protobuf更小、更快、更便捷。protobuf是跨语言的,并且自带一个编译器(protoc),只需要用protoc进行编译,就可以编译成Java、Python、C++、C#、Go等多种语言代码,然后可以直接使用,不需要再写其它代码,自带有解析的代码。只需要将要被序列化的结构化数据定义一次(在.proto文件定义),便可以使用特别生成的源代码(使用protobuf提供的生成工具)轻松的使用不同的数据流完成对结构数据的读写操作。甚至可以更新.proto文件中对数据结构的定义而不会破坏依赖旧格式编译出来的程序。GitHub地址:https://github.com/protocolbuffers/protobuf不同语言源码版本下载地址:https://github.com/protocolbuffers/protobuf/releases/latest 2、Protobuf的优缺点 Protobuf的优点如下:A、性能号,效率高序列化后字节占用空间比XML少3-10倍,序列化的时间效率比XML快20
  • Android即时通讯系列文章(3)数据传输格式选型:资源受限的移动设备上数据传输的困境
    「椎锋陷陈」微信技术号现已开通,为了获得第一手的技术文章推送,欢迎搜索关注! 前言 跟PC时代的传统互联网相比,移动互联网得益于移动设备的便携性,仅短短数年便快速地渗透到了人们生活、工作的各个方面。虽然通信技术和硬件设备在不断地更新升级换代,但就目前而言,电量、流量等对于移动设备来讲仍属于稀缺资源。 参与过Android系统版本升级适配工作的开发人员,也许可以很明显地感受到,近年来Android系统每一个更新的版本都是往更省电、更省流量、更省内存的方向靠拢的,比如: Android 6.0 引入了 低电耗模式 和 应用待机模式Android 7.0 引入了 随时随地低电耗模式Android 8.0 引入了 后台执行限制Android 9.0 引入了 应用待机存储分区 … 移动应用向网络发出的请求时主要的耗电来源之一,除了发送和接收数据包本身需要消耗电量外,开启无线装置并保持唤醒也会消耗额外的电量。特别是对于即时通讯这种网络交互频繁的应用场景来讲,数据传输大小是必须要考虑优化的一个方面,要尽量做到减少冗余数据,提高传输效率,从而减少对电量、流量的损耗。 二进制数据相对于可读性更好的文本数据而言,数据冗余量小,数据排列更为紧凑,因而体积更小,传输速度更快。但是要使用自定义二进制协议的话,就意味着需要自己定义数据结构,自己做序列化反序列化工作,版本兼容也是个问题
  • 五、GoogleProtobuf
    文章目录 1、编码与解码2、Protobuf简介3、proto文件格式4、Netty中使用Protobuf 本文档整理并出自尚硅谷韩顺平Netty教程 https://www.bilibili.com/video/BV1DJ411m7NR 1、编码与解码 编写网络应用程序时,因为数据在网络中传输的都是二进制字节码数据,在发送数据时就需要编码,接收数据时就需要解码codec(编解码器) 的组成部分有两个:decoder(解码器)和 encoder(编码器)。encoder 负责把业务数据转换成字节码数据,decoder 负责把字节码数据转换成业务数据。 Netty本身的编解码的机制和问题分析(为什么要引入Protobuf) Netty 提供的编码器 StringEncoder,对字符串数据进行编码ObjectEncoder,对 Java 对象进行编码 Netty 提供的解码器 StringDecoder, 对字符串数据进行解码ObjectDecoder,对 Java 对象进行解码 Netty 本身自带的 ObjectDecoder 和 ObjectEncoder 可以用来实现 POJO 对象或各种业务对象的编码和解码,底层使用的仍是 Java 序列化技术 , 而Java 序列化技术本身效率就不高,存在如下问题 无法跨语言序列化后的体积太大,是二进制编码的 5 倍多。序列化性能太低引出
  • SpringBoot + GoogleProtobuf
    SpringBoot + GoogleProtobuf 项目地址: protobuf-simple :https://github.com/Cyanss/protobuf-simple 一、环境配置   protobuf-java版本的选择需要对应到C++等其他端的版本以及Maven中protobuf-java版本。这里选择3.4.0版本进行演示及测试。 电脑系统: Windows 10 x64 bit protobuf GitHub: https://github.com/protocolbuffers/protobuf protobuf 源码下载: protobuf-java-3.4.0.zip https://github.com/protocolbuffers/protobuf/releases/download/v3.4.0/protobuf-java-3.4.0.zip protoc 编译器下载: protoc-3.4.0-win32.zip https://github.com/protocolbuffers/protobuf/releases/download/v3.4.0/protoc-3.4.0-win32.zip 注:protoc编译器3.4.0版本只有32位安装包。 protobuf-java 依赖: <dependency> <groupId>com
  • Protobuf 属性解释
    首先我们需要编写一个 proto 文件,定义我们程序中需要处理的结构化数据,在 protobuf 的术语中,结构化数据被称为 Message。proto 文件非常类似 java 或者 C 语言的数据定义,可以使用C或C++风格的注释。下面是一个proto文件的例子。 syntax = "proto3"; package tutorial; option java_package = "com.example.tutorial"; option java_outer_classname = "AddressBookProtos"; message Person { required string name = 1; required int32 id = 2; // Unique ID number for this person. optional string email = 3; enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber { required string number = 1; optional PhoneType type = 2 [default = HOME]; } repeated PhoneNumber phone = 4; } // Our address book
  • Netty 使用 Protobuf 序列化,太强大了!
    作者:rickiyang 出处:www.cnblogs.com/rickiyang/p/11074232.html 我们来使用Protobuf进行序列化,它和XML,json一样都有自己的语法,xml的后缀是.xml,json文件的后缀是.json,自然Protobuf文件的后缀就是.proto(哈哈,当然不是全称)。 下面我们使用Protobuf来封装一段消息,通过一个案例简单介绍一下它的使用。 首先我们用Protobuf的语法格式来写一段需要序列化的对象,命名格式为:Msg.proto option java_package = "cn.edu.hust.netty.demo10"; option java_outer_classname = "MessageProto"; message RequestMsg{ required bytes msgType = 1; required string receiveOne = 2; required string msg = 3; } message ResponseMsg{ required bytes msgType = 1; required string receiveOne = 2; required string msg = 3; } 关于Message.proto中的语法格式,详情大家google一下相关的说明
  • 深入理解 ProtoBuf 原理与工程实践(概述)
    ProtoBuf 作为一种跨平台、语言无关、可扩展的序列化结构数据的方法,已广泛应用于网络数据交换及存储。随着互联网的发展,系统的异构性会愈发突出,跨语言的需求会愈加明显,同时 gRPC 也大有取代Restful之势,而 ProtoBuf 作为g RPC 跨语言、高性能的法宝,我们技术人有必要 深入理解 ProtoBuf 原理,为以后的技术更新和选型打下基础。 我将过去的学习过程以及实践经验,总结成系列文章,与大家一起探讨学习,希望大家能有所收获,当然其中有不正确的地方也欢迎大家批评指正。 本系列文章主要包含: 深入理解 ProtoBuf 原理与工程实践(概述)深入理解 ProtoBuf 原理与工程实践(编码)深入理解 ProtoBuf 原理与工程实践(序列化)深入理解 ProtoBuf 原理与工程实践(工程实践) 一、什么是ProtoBuf ProtoBuf(Protocol Buffers)是一种跨平台、语言无关、可扩展的序列化结构数据的方法,可用于网络数据交换及存储。 在序列化结构化数据的机制中,ProtoBuf是灵活、高效、自动化的,相对常见的XML、JSON,描述同样的信息,ProtoBuf序列化后数据量更小、序列化/反序列化速度更快、更简单。 一旦定义了要处理的数据的数据结构之后,就可以利用ProtoBuf的代码生成工具生成相关的代码。只需使用 Protobuf
  • [翻译]ProtoBuf 官方文档(二)- 语法指引(proto2)
    翻译查阅外网资料过程中遇到的比较优秀的文章和资料,一是作为技术参考以便日后查阅,二是训练英文能力。 此文翻译自 Protocol Buffers 官方文档 Language Guide 部分 翻译为意译,不会照本宣科的字字对照翻译 以下为原文内容翻译 语法指引(proto2) 本指南介绍如何使用 protocol buffer 语言来构造 protocol buffer 数据,包括 .proto 文件语法以及如何从 .proto 文件生成数据访问类。它涵盖了 protocol buffer 语言的 proto2 版本:有关较新的 proto3 语法的信息,请参阅 Proto3 语法指引。 这是一个参考指南,有关使用本文档中描述的许多功能的分步示例,请参阅各种语言对应的具体 教程。 定义一个 Message 类型 首先让我们看一个非常简单的例子。假设你要定义一个搜索请求的 message 格式,其中每个搜索请求都有一个查询字符串,你感兴趣的特定结果页数(第几页)以及每页的结果数。下面就是定义这个请求的 .proto 文件: message SearchRequest { required string query = 1; // 查询字符串 optional int32 page_number = 2; // 第几页 optional int32 result_per_page =
  • [翻译] ProtoBuf 官方文档(二)- 语法指引(proto2)
    以下内容转载自 https://www.jianshu.com/p/6f68fb2c7d19 翻译查阅外网资料过程中遇到的比较优秀的文章和资料,一是作为技术参考以便日后查阅,二是训练英文能力。 此文翻译自 Protocol Buffers 官方文档 Language Guide 部分 翻译为意译,不会照本宣科的字字对照翻译 以下为原文内容翻译 语法指引(proto2) 本指南介绍如何使用 protocol buffer 语言来构造 protocol buffer 数据,包括 .proto 文件语法以及如何从 .proto 文件生成数据访问类。它涵盖了 protocol buffer 语言的 proto2 版本:有关较新的 proto3 语法的信息,请参阅 Proto3 语法指引。 这是一个参考指南,有关使用本文档中描述的许多功能的分步示例,请参阅各种语言对应的具体 教程。 定义一个 Message 类型 首先让我们看一个非常简单的例子。假设你要定义一个搜索请求的 message 格式,其中每个搜索请求都有一个查询字符串,你感兴趣的特定结果页数(第几页)以及每页的结果数。下面就是定义这个请求的 .proto 文件: message SearchRequest { required string query = 1; // 查询字符串 optional int32 page
  • 重新开始---sgg-netty----8
    总结: 1.channelHandlerContext 2.channelOption 3.EvevtLoopGroup和NioEventLoopGroup 4.Unpooled是netty提供的自带指针不用flip,readIndex和writeIndex -----------------------------------------72--------------------------------------------- -----------------------------------------73--------------------------------------------- 问题对象是如何编解码的呢? Protobuf 目前很多公司是tcp+Protobuf替换http+json -----------------------------------------74--------------------------------------------- 代码: 第一步:引入jar包,写.protoc文件 可以看下官网的protobuf的类型 syntax = "proto3"; //版本 option java_outer_classname = "StudentPOJO";//生成的外部类名,同时也是文件名 //protobuf
  • protobuf 序列化错误(error with serialization with protobuf)
    问题
  • protocal buffers 官方文档学习
    protocal buffers 官方文档学习 文章目录 protocal buffers 官方文档学习1.What are protocol buffers?2.选择你喜欢的语言3.怎么开始,步骤3.1下载和安装protocal buffer 编译器3.2阅读入门指南3.2.1 开发者指南3.2.1.1 怎么开始?3.2.1.2为什么不使用xml?3.2.1.3介绍一下protobuf3 3.2.2 proto3语言3.2.2.1 定义一个消息类型3.2.2.2 字段值类型3.2.2.3枚举3.2.2.4 使用消息类型3.2.2.5嵌套类型3.2.2.6 更新一个消息时怎么办3.2.2.7 未知的字段3.2.2.8 any 类型3.2.2.9Oneof3.2.2.11定义服务3.2.2.12可选项 3.2.3编码风格指南3.2.3.1标准文件格式3.2.3.2 消息和字段名称3.2.3.4 重复字段3.2.3.5 枚举3.2.3.4 重复字段3.2.3.5 枚举 前言:最近在做一个项目,负责通讯这块。采用技术是netty+protobuf 在安卓端和c#端进行通信。项目快差不多了,做一下沉淀,翻译一下protbuf文档,和自己的项目工程实践。工程实践代码可以看我的另一篇博文,是接着写的。 1.What are protocol buffers? protocal
  • 仅在开发模式下播放框架 java.lang.NoClassDefFoundError(Play framework java.lang.NoClassDefFoundError only in dev mode)
    问题
  • Protocol Buffer 和 OO 设计(Protocol buffer and OO design)
    问题 我在客户端 - 服务器架构中使用协议缓冲区作为有线数据格式。 域对象(java bean)将经历以下生命周期。 用于客户端业务逻辑转换为protobuf格式传送到服务器转换回域对象用于服务器端业务逻辑 ProtoBuf 文档中的“协议缓冲区和 OO 设计”部分建议将生成的类包装在适当的域模型中。 我想找出最好的方法。 例如,我有一个简单的原型定义。 package customer; option java_package = "com.example"; option java_outer_classname = "CustomerProtos"; message Customer { required string name = 1; optional string address = 2; } 这就是定义域模型的方式。 如您所见,数据完全存储在 proto builder 对象中。 package com.example; public class CustomerModel { private CustomerProtos.Customer.Builder builder = CustomerProtos.Customer.newBuilder(); public String getName() { return builder.getName(); }
  • 深入 ProtoBuf - 简介Protobuf 使用指南
    简单来讲, ProtoBuf 是结构数据序列化[1] 方法,可简单类比于 XML[2],其具有以下特点: 语言无关、平台无关。即 ProtoBuf 支持 Java、C++、Python 等多种语言,支持多个平台 高效。即比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单 扩展性、兼容性好。你可以更新数据结构,而不影响和破坏原有的旧程序 序列化[1]:将结构数据或对象转换成能够被存储和传输(例如网络传输)的格式,同时应当要保证这个序列化结果在之后(可能在另一个计算环境中)能够被重建回原来的结构数据或对象。 更为详尽的介绍可参阅 维基百科。 类比于 XML[2]:这里主要指在数据通信和数据存储应用场景中序列化方面的类比,但个人认为 XML 作为一种扩展标记语言和 ProtoBuf 还是有着本质区别的。 使用 ProtoBuf 对 ProtoBuf 的基本概念有了一定了解之后,我们来看看具体该如何使用 ProtoBuf。 第一步,创建 .proto 文件,定义数据结构,如下例1所示: // 例1: 在 xxx.proto 文件中定义 Example1 message message Example1 { optional string stringVal = 1; optional bytes bytesVal = 2; message
  • Google Protobuf入门与使用
    [toc] Google Protobuf入门与使用 Protobuf是Google的编解码技术,在业界十分流行,通过代码生成工具可以生成不同语言版本的源代码。 Protobuf代码生成工具与使用 protobuf下载 访问Google的Protobuf项目页需要×××,但是其也把代码放到了Github上,并且提供了不需要编译即可进行使用的版本,地址如下:Protobuf Github地址。 在学习《Netty权威指南》时,使用的是protobuf 2.x的版本,但由于protobuf具有向前兼容的特性,所以即使下载3.x的版本也是可以使用2.x的功能特性,这里我下载3.5.1的版本,注意protobuf的代码生成工具名为protoc。 使用protoc生成java代码 要使用protoc生成java代码,需要先编写.proto文件,下面使用的是《Netty权威指南》中的例子。 SubscribeReq.proto syntax = "proto2"; package netty; option java_package = "cn.xpleaf.protobuf"; option java_outer_classname = "SubscribeReqProto"; message SubscribeReq{ required int32 subReqID = 1
  • Java:JSON-> Protobuf和反向转换(Java: JSON -> Protobuf & back conversion)
    问题 我有一个现有系统,该系统在GUI和服务器之间使用基于Protobuf的通信协议。 现在,我想添加一些持久性,但是目前protobuf消息已直接转换为第三方自定义对象。 有没有一种方法可以将原始消息转换为json ,然后可以将其持久化到数据库中。 注意:我不太喜欢将二进制protobuf写入数据库的想法,因为它有一天可能变得无法与较新版本向后兼容并以这种方式破坏系统。 回答1 如对类似问题的回答中所述,自v3.1.0起,这是ProtocolBuffers的受支持功能。 对于Java,请包括扩展模块com.google.protobuf:protobuf-java-util,并使用JsonFormat,如下所示: JsonFormat.parser().ignoringUnknownFields().merge(json, yourObjectBuilder); YourObject value = yourObjectBuilder.build(); 回答2 我们目前正在使用protobuf-java-format将Protobuf消息( Message任何子类)转换为JSON格式,以通过我们的Web API发送。 只需做: JsonFormat.printToString(protoMessage) 回答3 我不太喜欢将二进制protobuf写入数据库的想法
  • SpringBoot整合Grpc实现跨语言RPC通讯
    什么是gRPC gRPC是谷歌开源的基于go语言的一个现代的开源高性能RPC框架,可以在任何环境中运行。它可以有效地连接数据中心内和跨数据中心的服务,并提供可插拔的支持,以实现负载平衡,跟踪,健康检查和身份验证。它还适用于分布式计算的最后一英里,用于将设备,移动应用程序和浏览器连接到后端服务。 简单的服务定义:使用Protocol Buffers定义您的服务,这是一个功能强大的二进制序列化工具集和语言. 跨语言和平台工作:自动为各种语言和平台的服务生成惯用的客户端和服务器存根,当然单纯的java语言之间也是可以的。 一般主要是Java和Go,PHP,Python之间通讯。 快速启动并扩展:使用单行安装运行时和开发环境,并使用框架每秒扩展到数百万个RPC 双向流媒体和集成的身份验证:基于http/2的传输的双向流和完全集成的可插拔身份验证 官网地址:https://www.grpc.io/ 这是一个可以运行的例子,本文基于此增加了一些代码:https://codenotfound.com/grpc-java-example.html 这个例子使用的jar是grpc-spring-boot-starter@io.github.lognet 这个例子也可以参考:https://github.com/yidongnan/grpc-spring-boot-starter