天道酬勤,学无止境

In a proto, how can I define a map as a custom option

In my proto file, I want to define a map as a custom option, tried a few things but none is working.

my metadata proto file:

syntax = "proto2";
import "google/protobuf/descriptor.proto";

package com.util;
option java_package = "com.util";

message MyMeta {
  optional bool needValidation = 1;
  map<string, string> fileMap = 2;
}

extend google.protobuf.FieldOptions {
  optional MyMeta meta = 80412; 
}

my proto file

syntax = "proto3";

package com.test;

import "util/meta.proto";
import "google/protobuf/timestamp.proto";

message MyMeta {
  int32 id = 1 [(com.util.meta).needValidation = false, /*looking for a way to set a map (com.meta).tableOptions = {"t,raw_orders"}]*/;

}

Is this possible?

评论

This works:

message MyMeta {
  int32 id = 1 [
        (com.util.meta) = {
                needValidation: false,
                fileMap: [
                        {
                                key: "t",
                                value: "raw_orders"
                        }
                ];
        }];
}

The protobuf map is syntactic sugar for a repeated field of map entry messages with key and value fields. 1

In your case, your meta message

message MyMeta {
  optional bool needValidation = 1;
  map<string, string> fileMap = 2;
}

is equivalent to

message MyMeta {
  optional bool needValidation = 1;

  message FileMapEntry {
    string key = 1;
    string value = 2;
  }
  repeated FileMapEntry fileMap = 2;
}

Of course, it would be much nicer if there was a more obvious way to specify a map value in an option.

Seems it is not possible. To make my logic, I created a string like "StoreOrders:raw_orders_test,OrderItems:raw_order_items_test


message MyMeta {
  int32 id = 1 [(com.util.meta).needValidation = false, (com.meta).tableOptions = "TableA:valueA,TableB:valueB;
}

and in my jav code and splitting the string to create a hash map.

受限制的 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 官方文档(二)- 语法指引(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
  • Proto3使用指南
    这篇指南讲述如何使用Protocol Buffers来结构化你的Protocol Buffer数据,包括.proto文件语法以及如何从.proto文件生成你的访问类型。本文主要涵盖了proto3的语法,proto2的语法参见Proto2 Language Guide。 这是一篇参考教程 -- 本文中诸多功能的分步示例,详见tutorial。 目录 定义消息类型标量类型默认值枚举使用其他消息类型嵌套类型更新消息类型未知字段AnyOneofMaps包定义服务Json Mapping可选项编译生成 定义消息类型 首先来看一个非常简单的例子。假设你想定义一个搜素请求的消息格式,其中每个搜索请求都包含一个检索字段、特定的结果页(你感兴趣的结果所在的页面)以及每个页面的结果数量。你可以使用下面的.proto文件来定义消息类型。 syntax = "proto3"; message SearchRequest { string query = 1; int32 page_number = 2; int32 result_per_page = 3; } 文件的第一行指明你要使用proto3语法:如果你不指定的话,protocol buffer编译器将默认你使用的是proto2。这必须写在文件中非空、非注释的第一行。SearchRequest消息明确定义了三个字段(键值对)
  • Protobuf3语言指南
    定义一个消息类型 指定字段类型分配标识号指定字段规则添加更多消息类型添加注释保留标识符(Reserved)从.proto文件生成了什么?标量数值类型默认值枚举使用其他消息类型 导入定义使用proto2消息类型嵌套类型更新一个消息类型AnyOneof 使用OneofOneof 特性向后兼容性问题映射(Maps) 向后兼容性问题包(Packages) 包及名称的解析定义服务JSON 映射选项 自定义选项生成你的类 英文原文: Language Guide (proto3) 中文出处: Protobuf语言指南 [译]Protobuf 语法指南 中文出处是proto2的译文,proto3的英文出现后在原来基础上增改了,水平有限,还请指正 这个指南描述了如何使用Protocol buffer 语言去描述你的protocol buffer 数据, 包括 .proto文件符号和如何从.proto文件生成类。包含了proto2版本的protocol buffer语言:对于老版本的proto3 符号,请见Proto2 Language Guide(以及中文译本,抄了很多这里的感谢下老版本的翻译者) 本文是一个参考指南——如果要查看如何使用本文中描述的多个特性的循序渐进的例子,请在教程中查找需要的语言的教程。 定义一个消息类型 先来看一个非常简单的例子。假设你想定义一个“搜索请求”的消息格式
  • Android Jatpack DataStore使用详解
    简介 Jetpack DataStore 是一种数据存储解决方案,允许您使用协议缓冲区存储键值对或类型化对象。DataStore 使用 Kotlin 协程和流程以异步、一致的事务方式存储数据。 如果您当前在使用 SharedPreferences 存储数据,请考虑迁移到 DataStore。 注意:如果您需要支持大型或复杂数据集、部分更新或参照完整性,请考虑使用 Room,而不是 DataStore。DataStore非常适合简单的小型数据集,不支持部分更新或参照完整性。 Preferences DataStore 和 Proto DataStore DataStore 提供两种不同的实现:Preferences DataStore 和 Proto DataStore。 Preferences DataStore 使用键存储和访问数据。此实现不需要预定义的架构,也不确保类型安全。 Proto DataStore 将数据作为自定义数据类型的实例进行存储。此实现要求您使用协议缓冲区来定义架构,但可以确保类型安全。 设置 如需在您的应用中使用 Jetpack DataStore,请根据您要使用的实现向 Gradle 文件添加以下内容。 如果是使用Protobuf DataStore // Typed DataStore (Typed API surface, such as Proto)
  • protobuf详细介绍和使用
    一、protobuf初识 (一)protocol buffers 是什么? protocol buffers 是一种灵活,高效,自动化机制的结构数据序列化方法-可类比 XML,但是比 XML 更小、更快、更为简单。你可以定义数据的结构,然后使用特殊生成的源代码轻松的在各种数据流中使用各种语言进行编写和读取结构数据。你甚至可以更新数据结构,而不破坏根据旧数据结构编译而成并且已部署的程序。 (二)它是如何工作的? 你可以通过在 .proto 文件中定义 protocol buffer message 类型,来指定你想如何对序列化信息进行结构化。每一个 protocol buffer message 是一个信息的小逻辑记录,包含了一系列的 name-value 对。这里有一个非常基础的 .proto 文件样例,它定义了一个包含 "person" 相关信息的 message: message Person { required string name = 1; required int32 id = 2; optional string email = 3; ​ enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } ​ message PhoneNumber { required string number = 1; optional
  • 深入 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
  • protobuf语法详解
    文章目录 一、包(package)二、选项(option)三、消息类型(message)3.1、常规消息类型3.1.1、字段修饰符3.1.2、字段类型3.1.2.1、标量类型3.1.2.2、枚举类型3.1.2.3、Any类型3.1.2.4、oneof类型3.1.2.5、map类型 3.1.3、默认值说明3.1.4、标识号 3.2、多个消息类型3.3、嵌套消息类型3.4、更新消息类型 四、RPC服务(service)五、其他5.1 导入proto文件(import) 一、包(package)   为.proto文件添加package声明符,可以防止不同 .proto项目间消息类型的命名发生冲突。 package foo.bar; message Open { ... } message Foo { ... foo.bar.Open open = 1; ... } protobuf包类型的解析和C++类似,都是由内而外进行解析。对于C++,产生的类会被包装在C++的命名空间中,如上例中的Open会被封装在 foo::bar空间中。 二、选项(option)   option会影响特定环境下的处理方式,但是不会改变整个文件声明的含义。 option optimize_for = CODE_SIZE; 三、消息类型(message)   message用于定义结构数据,可以包含多种类型字段
  • 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
  • RESTful服务中部分更新的最佳实践(Best practice for partial updates in a RESTful service)
    问题 我正在为客户管理系统编写RESTful服务,并且试图找到部分更新记录的最佳实践。 例如,我希望呼叫者能够读取带有GET请求的完整记录。 但是为了进行更新,只允许记录上的某些操作,例如将状态从“启用”更改为“禁用”。 (我有比这更复杂的场景) 出于安全原因,我不希望呼叫者仅使用更新的字段来提交整个记录(这也感觉像是过大了)。 有没有建议的构造URI的方法? 在阅读REST书籍时,似乎不喜欢RPC样式调用。 如果以下呼叫返回ID为123的客户的完整客户记录 GET /customer/123 <customer> {lots of attributes} <status>ENABLED</status> {even more attributes} </customer> 我应该如何更新状态? POST /customer/123/status <status>DISABLED</status> POST /customer/123/changeStatus DISABLED ... 更新:扩大问题。 如何将“业务逻辑调用”整合到REST API中? 有达成共识的方式吗? 本质上,并非所有方法都是CRUD。 有些更为复杂,例如“ sendEmailToCustomer(123) ”,“ mergeCustomers(123,456) ”,“ countCustomers() ”
  • 使用 Jetpack DataStore 进行数据存储
    Jetpack DataStore 是一种数据存储解决方案,允许您使用协议缓冲区存储键值对或类型化对象。DataStore 使用 Kotlin 协程和流程以异步、一致的事务方式存储数据。 如果您当前使用 SharedPreferences 存储数据,请考虑迁移到 DataStore。 注意:如果您需要支持大型或复杂数据集、部分更新或参照完整性,请考虑使用 Room,而不是 DataStore。DataStore 非常适合简单的小型数据集,不支持部分更新或参照完整性。 Preferences DataStore 和 Proto DataStore DataStore 提供两种不同的实现:Preferences DataStore 和 Proto DataStore。 Preferences DataStore 使用键存储和访问数据。此实现不需要预定义的架构,也不确保类型安全。Proto DataStore 将数据存储为自定义数据类型的实例。此实现要求您使用协议缓冲区来定义架构,但可以确保类型安全。 欢迎使用 Jetpack DataStore,这是一个经过改进的全新数据存储解决方案,旨在替代原有的 SharedPreferences。Jetpack DataStore 基于 Kotlin 协程和 Flow 开发,并提供两种不同的实现: Proto DataStore 和
  • 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
  • Jetpack的DataStore数据存储组件的使用简介
    Jetpack的DataStore数据存储组件的使用简介 介绍 Jetpack DataStore是一种数据存储解决方案,可让您使用Protocol Buffer(协议缓冲区)存储键值对或类型化对象。DataStore使用Kotlin协程和Flow异步,一致的事务方式来存储数据。 注意: 如果需要支持大型或复杂的数据集,部分更新或参考完整性,请考虑使用 Room 而不是DataStore。DataStore非常适合小型,简单的数据集,并且不支持部分更新或参照完整性。 目的 Jetpack DataStore 是经过改进的新版数据存储解决方案,旨在取代 SharedPreferences。以异步、一致的事务方式存储数据,克服了 SharedPreferences 的大部分缺点。 DataStore实现方式 DataStore 基于 Kotlin 协程和流程构建而成,提供两种不同的实现,分别如下: Preferences DataStore方式 使用键存储和访问数据。此实现不需要预定义的架构,并且不提供类型安全性。 Proto DataStore方式 将数据存储为自定义数据类型的实例。此实现要求您使用协议缓冲区定义架构,但它提供类型安全性。 SharedPreferences 与 DataStore 支持功能的对比
  • Custom protobuf options of message of type Any in Go
    I have a GRPC service defined like: message SendEventRequest { string producer = 1; google.protobuf.Any event = 2; } message SendEventResponse { string event_name = 1; string status = 2; } service EventService { rpc Send(SendEventRequest) returns (SendEventResponse); } I also have defined a custom message option: extend google.protobuf.MessageOptions { // event_name is the unique name of the event sent by the clients string event_name = 50000; } What I want to achieve is have clients create custom proto messages that set the event_name option to a "constant". For instance: message
  • protobuf生成Go代码插件gogo/protobuf
    1. 从json开始 谈到序列化,大家最先想到的,可能是 JSON 或者 XML,这两种序列化协议都是基于文本的编码方式进行数据传输。类似的还有 YAML 等。 JSON 拥有许多优点,使之成为最广泛使用的序列化协议之一。JSON 协议简单,人眼可读,序列化后十分简洁且解析速度快。此外,JSON 具备 JavaScript 的先天性支持,被广泛应用于 Web Browser 的应用场景中,并且是 Ajax 的事实标准协议。 JSON 的适用场景比较多,典型应用场景包括: 公司外部之间传输数据量相对较小,实时性要求相对低的服务。 基于 Web browser 的 Ajax 请求。 接口经常发生变化,并对可调式性要求较高的场景,例如移动 App 与服务端的通信。 然而,由于 JSON 本身设计的一些特点,在一些场景下使用 JSON 仍然不是最优解。如: 需要标准的 IDL ,增强参与各方业务约束的场景。由于 JSON 协议往往只能使用文档的方式来进行约定,这可能会给调试带来一些不便与不明确。 对性能和简洁性有较高要求的场景。JSON 在一些语言中的序列化和反序列化需要采用反射机制,在性能要求特别高的场景下,可能不是最优解。 对于大数据量服务或持久化场景。JSON 进行序列化的额外空间开销比较大,这也意味着较大的内存和磁盘开销。 对于以上场景,使用一些基于 IDL
  • Protocol Buffer 官网文档整理
    Protocol Buffer 官网文档整理 1-1 前言 网上很多proto2的教程很多,我这里本来再看Netty的源码, 涉及到RPC的框架,加上公司有点项目也涉及的gRpc一些相关的开发, 所以我这里这整理下Protocol Buffers的官方教程。 1-2 定义消息类型 // 官网例子 message SearchRequest { required string query = 1; optional int32 page_number = 2; optional int32 result_per_page = 3; } 1-2-2 指定字段类型 上面的SearchRequest消息定义指定了三个字段(名称/值对),一个用于每条数据要在此类型的消息包括。每个字段都有一个名 称和类型。 'query’ 字段的类型是'String‘,'page_number’的字段类型'int32‘,’result_per_page' 的类型是‘int32'。也可以指定其他的类型,在后面的文档中 都会做说明。比如再实际开发过程成会遇到多个传输协议怎末处理等可能遇到的问题。 1-2-3 分配字段编号 消息定义中的每个字段都有一个唯一的编号。这些数字用于标识消息二进制格式的 (/protocol-buffers/docs/encoding) 字段,一旦使用了消息类型, 就不应更改这些数字
  • ROS移植到Cyber小结(protobuf)
    文章目录 一、安装Cmake-3.16版本二、protobuf文件问题1.关于包名的命名2.time 自定义为uint643.char 用float代替 三、编译生成后类成员变量访问方法四、geometry_msgs 改写后赋值(嵌套+repeated)五、交叉编译生成二进制文件过大六、回调函数是类成员函数七、Proto3 区别于 Proto2 的使用参考文档: 一、安装Cmake-3.16版本 cmake官网正常是上不去的,需要fq 二、protobuf文件问题 1.关于包名的命名 推荐的写法是从根目录开始写,使用绝对路径(需要统一整个大的目录结构框架)前期可根据之前的ros功能包名及节点名来进行命名消息名用“驼峰式命名法”,消息变量名不能有大写字母属性顺序号需要按照顺序进行定义,且不允许有重复import用于包含其他proto文件的message/enum类型(import的文件需与当前文件处于同一文件夹下)对于已编译好的项目,若要增加新的消息 不要修改已存在字段的编号不能移除已经存在的required字段移除optional和repeated类型字段时,顺序号必需保留,不可复用 syntax = "proto2"; import "std_msgs.proto"; package dispensing.machine_control; message Wheel{
  • 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(); }
  • 在导入的 .proto 文件中扩展 protobuf.FieldOptions(Extending protobuf.FieldOptions in imported .proto file)
    问题 我正在尝试在 google 协议缓冲区中定义我的自定义字段选项。 如果我创建这样的文件,一切正常: import "google/protobuf/descriptor.proto"; package tutorial; extend google.protobuf.FieldOptions { optional int32 myopt = 70000; } message Persona { required string name = 1 [(myopt)=5]; } 但是,如果我尝试将“myopt”定义移动到另一个文件,编译将失败: myext.proto: package myext; import "google/protobuf/descriptor.proto"; extend google.protobuf.FieldOptions { optional int32 myopt = 70000; } 地址簿.proto: import "google/protobuf/descriptor.proto"; import "myext.proto"; package tutorial; message Persona { required string name = 1 [(myopt)=5]; } 汇编: $ protoc --cpp_out=. -I/usr
  • 如何在 JavaScript 中使用关联值实现类似 Swift 的枚举?(How to implement Swift-like enums with associated values in JavaScript?)
    问题 Swift 语言具有出色的枚举支持。 不仅可以定义带有案例的标准枚举,而且案例可以具有“关联到它们”的可选值。 例如,取自 Swift 文档: enum Barcode { case UPCA(Int, Int, Int, Int) case QRCode(String) case Other } 这样就可以通过传入一个值来创建一个 Barcode 枚举,如下所示: var productBarcode = Barcode.UPCA(8, 85909, 51226, 3) 并且也switch上productBarcode在稍后的日期来检索相关联的值(元组int或多个)。 我一直在尝试在 JavaScript(特别是 ES5)中实现这种enum系统,但遇到了障碍。 构建枚举系统的最佳方法是什么,尤其是具有关联值的系统? 回答1 您可以为此使用受歧视的联合。 这个例子使用了 Typescript,但这个概念与 Javascript 相似,只是没有类型安全。 interface UPCA { kind: "UPCA"; numberSystem: number; manufacturer: number; item: number; checkDigit: number; } interface QRCode { kind: "QRCode"; data: string; }