protobuf 文本格式是什么样的?

2023-12-01

Google Protocol Buffers 不仅可以以二进制格式序列化,还可以序列化为文本,称为文本原型。然而,我无法轻易找到此类文本的示例;它会是什么样子?

预期答案:一个涵盖 protobuf IDL/proto 文件允许的所有功能的示例,包括文本形式的示例 protobuf 数据包。


我自己做的:

测试原型

enum MyEnum
{
    Default = 0;
    Variant1 = 1;
    Variant100 = 100;
}

message Test {
    required string f1 = 1;
    required int64 f2 = 2;
    repeated uint64 fa = 3;
    repeated int32 fb = 4;
    repeated int32 fc = 5 [packed = true];
    repeated Pair pairs = 6;
    optional bytes bbbb = 7;

    extensions 100 to max;
}

message Pair {
    required string key = 1;
    optional string value = 2;
}



extend Test {
    optional bool gtt = 100;
    optional double gtg = 101;
    repeated MyEnum someEnum = 102;
}

示例输出:

f1: "dsfadsafsaf"
f2: 234
fa: 2342134
fa: 2342135
fa: 2342136
fb: -2342134
fb: -2342135
fb: -2342136
fc: 4
fc: 7
fc: -12
fc: 4
fc: 7
fc: -3
fc: 4
fc: 7
fc: 0
pairs {
  key: "sdfff"
  value: "q\"qq\\q\n"
}
pairs {
  key: "   sdfff2  \321\202\320\265\321\201\321\202 "
  value: "q\tqq<>q2&\001\377"
}
bbbb: "\000\001\002\377\376\375"
[gtt]: true
[gtg]: 20.0855369
[someEnum]: Variant1

该程序:

#include <google/protobuf/text_format.h>

#include <stdio.h>
#include "test.pb.h"

int main() {
    Test t;
    t.set_f1("dsfadsafsaf");
    t.set_f2(234);
    t.add_fa(2342134);
    t.add_fa(2342135);
    t.add_fa(2342136);
    t.add_fb(-2342134);
    t.add_fb(-2342135);
    t.add_fb(-2342136);
    t.add_fc(4);
    t.add_fc(7);
    t.add_fc(-12);
    t.add_fc(4);
    t.add_fc(7);
    t.add_fc(-3);
    t.add_fc(4);
    t.add_fc(7);
    t.add_fc(0);
    t.set_bbbb("\x00\x01\x02\xff\xfe\xfd",6);

    Pair *p1 = t.add_pairs(), *p2 = t.add_pairs();
    p1->set_key("sdfff");
    p1->set_value("q\"qq\\q\n");
    p2->set_key("   sdfff2  тест ");
    p2->set_value("q\tqq<>q2&\x01\xff");

    t.SetExtension(gtt, true);
    t.SetExtension(gtg, 20.0855369);
    t.AddExtension(someEnum, Variant1);

    std::string str;
    google::protobuf::TextFormat::PrintToString(t, &str);
    printf("%s", str.c_str());

    return 0;
}

此示例的二进制 protobuf(为了完整性):

00000000  0a 0b 64 73 66 61 64 73  61 66 73 61 66 10 ea 01  |..dsfadsafsaf...|
00000010  18 f6 f9 8e 01 18 f7 f9  8e 01 18 f8 f9 8e 01 20  |............... |
00000020  8a 86 f1 fe ff ff ff ff  ff 01 20 89 86 f1 fe ff  |.......... .....|
00000030  ff ff ff ff 01 20 88 86  f1 fe ff ff ff ff ff 01  |..... ..........|
00000040  2a 1b 04 07 f4 ff ff ff  ff ff ff ff ff 01 04 07  |*...............|
00000050  fd ff ff ff ff ff ff ff  ff 01 04 07 00 32 10 0a  |.............2..|
00000060  05 73 64 66 66 66 12 07  71 22 71 71 5c 71 0a 32  |.sdfff..q"qq\q.2|
00000070  23 0a 14 20 20 20 73 64  66 66 66 32 20 20 d1 82  |#..   sdfff2  ..|
00000080  d0 b5 d1 81 d1 82 20 12  0b 71 09 71 71 3c 3e 71  |...... ..q.qq<>q|
00000090  32 26 01 ff 3a 06 00 01  02 ff fe fd a0 06 01 a9  |2&..:...........|
000000a0  06 ea 19 0c bf e5 15 34  40 b0 06 01              |.......4@...|
000000ac

请注意,该示例并不完全正确:libprotobuf ERROR google/protobuf/wire_format.cc:1059] Encountered string containing invalid UTF-8 data while parsing protocol buffer. Strings must contain only UTF-8; use the 'bytes' type for raw bytes.

注意protoc该工具还可以将消息解码为文本,无论是否带有原始文件:

$ protoc --decode=Test test.proto < test.bin 
[libprotobuf ERROR google/protobuf/wire_format.cc:1091] String field 'value' contains invalid UTF-8 data when parsing a protocol buffer. Use the 'bytes' type if you intend to send raw bytes. 
f1: "dsfadsafsaf"
f2: 234
fa: 2342134
fa: 2342135
fa: 2342136
fb: -2342134
fb: -2342135
fb: -2342136
fc: 4
fc: 7
fc: -12
fc: 4
fc: 7
fc: -3
fc: 4
fc: 7
fc: 0
pairs {
  key: "sdfff"
  value: "q\"qq\\q\n"
}
pairs {
  key: "   sdfff2  \321\202\320\265\321\201\321\202 "
  value: "q\tqq<>q2&\001\377"
}
bbbb: "\000\001\002\377\376\375"
[gtt]: true
[gtg]: 20.0855369
[someEnum]: Variant1
$ protoc --decode_raw  < test.bin 
1: "dsfadsafsaf"
2: 234
3: 2342134
3: 2342135
3: 2342136
4: 18446744073707209482
4: 18446744073707209481
4: 18446744073707209480
5: "\004\007\364\377\377\377\377\377\377\377\377\001\004\007\375\377\377\377\377\377\377\377\377\001\004\007\000"
6 {
  1: "sdfff"
  2: "q\"qq\\q\n"
}
6 {
  1: "   sdfff2  \321\202\320\265\321\201\321\202 "
  2: "q\tqq<>q2&\001\377"
}
7: "\000\001\002\377\376\375"
100: 1
101: 0x403415e5bf0c19ea
102: 1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

protobuf 文本格式是什么样的? 的相关文章

  • 序列化 ArrayList

    我正在尝试编写一个 Android 游戏 即使用户想要返回主菜单或者活动被系统终止 我也希望能够暂停游戏 onSaveInstanceState 似乎并没有给我很大的控制权来决定何时可以读回捆绑包 而且据我所知 捆绑包仅在短时间内有效 所以
  • 我可以在 UITextView 中以编程方式选择文本吗?

    我想在 UITextView 上选择文本 类似于我们点击时看到的默认 选择 和 全选 弹出选项 我希望用户能够从我的自定义菜单中执行此操作 我玩了 selectedRange 但这似乎并没有解决问题 有任何想法吗 Thanks The se
  • C++网络序列化[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一种将 C 数据包序列化为网络流的解决方案 我在这里看到很多帖子提到人们 ACE 谷歌协议缓
  • 将 json 反序列化为 Symfony 3.2 中的嵌入对象 - 预期参数类型为“Acme\StoreBundle\Document\Gps”,给定“array”

    Acme StoreBundle 文档 人 MongoDB Document class Person MongoDB bool private hasemail MongoDB EmbedOne targetDocument Gps pr
  • 序列化时如何跳过 xml 声明?

    我正在尝试输出一个没有 xml 头的 xml 文件 例如 我试过 Type t obj GetType XmlSerializer xs new XmlSerializer t XmlWriter xw XmlWriter Create c
  • 无法序列化 SolidColorBrush

    错误消息表明我无法序列化类 因为无法序列化 SolidColorBrush 该类具有 Brush 的公共属性 有解决办法吗 它更复杂 我尝试使用可以序列化的支持属性问题是我还需要冻结高光 这样我就可以在BackgroundWorker上创建
  • docx 模板 Docx4j 替换 Java 中的文本

    我是 Docx4j 的新手 我的任务是替换 docx 模板的一些文本 我阅读了 docx4j 的入门指南 但我认为我没有完全理解整个概念 好吧 无论如何 我已经尝试过 Docx4j 的解压模板 1 它与给定的 docx 配合得很好 但是当我
  • 使对象在运行时可序列化[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 有没有办法在运行时使对象可序列化 我应该使用反射吗 注意 该对象是外部库的一部分 因此我没有它的源代码 tl 博士 不 虽然您可以使用Typ
  • 将2个暗淡数组“列表列表”输出到python中的文本文件

    简单的问题 我正在创建一个两个暗淡的数组 ddist 0 d for in 0 d 在下面的代码中使用列表 它使用 gis 数据输出距离 我只是想要一种简单的方法来获取数组 列表的结果并将其输出到保持相同的 N N 结构的文本文件 我过去曾
  • 使用 pandas 删除停用词

    我想从数据框的列中删除停用词 列内有需要拆分的文本 例如我的数据框如下所示 ID Text 1 eat launch with me 2 go outside have fun 我想应用停用词text column所以应该分开 我试过这个
  • 如何使用 Jackson 将列表内容序列化为平面 JSON 对象?

    给定以下 POJO public class City private String title private List
  • djangorest框架:从序列化器validate()方法设置字段级错误

    我有一个序列化程序 它根据其他字段的值验证字段 在错误响应中 我想将每个字段错误显示为字段错误 而不是显示 non field errors 下的所有内容 如果我提出错误 就会发生这种情况对象级验证方法中的 ValidationError
  • 如何在 Java 中测试一个类是否正确实现了 Serialized(不仅仅是 Serialized 的实例)

    我正在实现一个可序列化的类 因此它是一个与 RMI 一起使用的值对象 但我需要测试一下 有没有办法轻松做到这一点 澄清 我正在实现该类 因此在类定义中添加 Serialized 很简单 我需要手动序列化 反序列化它以查看它是否有效 我找到了
  • 委托给子组件的模式

    在我正在工作的产品中 非常基本的场景之一是类的序列化 通常 要序列化的类会在其子组件上调用序列化 例如如果有一个类 s t 班级 A B C D 那么A Pack会调用pack B C D 上的函数 由于有很多这样的类 因此必须一遍又一遍地
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 无法使用 Json.NET 8.0.1 反序列化具有字节数组属性的对象

    升级代码库以使用 Json NET 8 0 1 后 一些反序列化出现问题 使用 Json NET 7 0 1 一切正常 显然这是类型属性的反序列化byte 这会导致问题 如果我删除byte 属性它工作正常 我可以使用这个简单的控制台应用程序
  • 在表单中编辑序列化哈希?

    我正在序列化存储在settings表中的字段 并且希望能够在表单字段中编辑该哈希 class Template lt ActiveRecord Base serialize settings end 但我就是这么做那么文本区域只显示序列化数
  • 使用 C# 从文本中删除数字

    我有一个要处理的文本文件 其中有一些数字 我只想要其中的文字 而不是其他任何东西 我成功删除了标点符号 但是如何删除数字呢 我想要使 用 C 代码 另外 我想删除长度大于 10 的单词 如何使用 Reg 表达式来做到这一点 您可以使用正则表
  • 如何使用泛型类型的 DataContractSerializer 编写自定义序列化器?

    我想编写一个自定义序列化器 用于将会话状态存储到Azure 缓存 预览版 这意味着这个自定义序列化器必须实现IDataCacheObjectSerializer 如果我错了 请告诉我 我需要编写这个自定义序列化程序的原因是我需要序列化一些包
  • 如何为二进制格式化程序创建 SerializationBinder,以处理类型从一个程序集和命名空间到另一个程序集和命名空间的移动

    上下文如下 我想通过将代码移动到不同的项目来重构代码 其中一些代码包含可序列化的 DTO 用于 跨多个端点发送和接收数据 如果我移动代码 序列化就会中断 因此它不是 向后兼容我的应用程序的旧版本 这个问题的一个解决方案是 Serializa

随机推荐

  • 选择表中某个值的名称(例如 max)

    我有一个数字向量 我们就这样称呼它吧mydata str mydata num 1 236 2 1 1 2 2 1 2 1 2 2 然后我可以使用以下方法计算每个值table table mydata mydata 1 2 9 10 20
  • 创建aarch64裸机程序时如何防止“main.o:(.eh_frame+0x1c): relocation truncated to fit: R_AARCH64_PREL32 against ‘.text’”?

    在创建裸机可执行文件时 我遇到了以下错误 main o eh frame 0x1c relocation truncated to fit R AARCH64 PREL32 against text collect2 error ld re
  • C++ while 循环不工作

    include
  • SQL Server 行编号和筛选结果

    我有一个应用程序 需要在列表中显示数据 页面 基本思想是相当普遍的 显示屏显示项目列表 显示屏底部有某种控件 可让您转到下一个数据 页面 一切都很好 我有这个工作 以下是我用来支持 下一个 行为的视图中的 SQL CREATE VIEW C
  • 输入参数太多

    我收到以下有关 fprintf 函数中输入参数过多的错误消息 但在我看来 通过了适量的论点 所有这些都是在我制作的 GUI 指南的背景下进行的 见最后的图片 Error while evaluating uicontrol Callback
  • Microsoft.Office.Interop.Excel 真的很慢

    我正在使用标准 Microsoft Office Interop Excel 将 1200 X 800 矩阵 indexMatrix 导出到 excel 文件 该应用程序可以工作 只是它真的非常非常慢 即使对于 100 x 100 矩阵 我
  • 两个不同的字符串可以生成相同的MD5哈希码吗?

    我们为每个二进制资产生成一个 MD5 哈希值 这用于检查某个二进制资产是否已在我们的应用程序中 但是两个不同的二进制资产是否有可能生成相同的 MD5 哈希值 那么两个不同的字符串有可能生成相同的 MD5 哈希值吗 对于一套甚至数十亿的资产来
  • 使用单个 SVG 地图的 Googlemaps TileProvider

    在我的 Android 应用程序中 我想显示一个具有滚动和缩放功能的简单地图 我不想依赖网络连接来获取地图 因此所有内容都必须随应用程序一起提供 我有一个想要显示的国家 地区的 SVG 文件 只有陆地面积和 或水对我来说很重要 我认为显示地
  • 在没有 Apple 开发者帐户的情况下将 Apache Cordova 应用程序部署到 iPad

    在使用 Visual Studio 2013 Pro 为朋友开发了一个应用程序之后Apache Cordova 扩展 我希望它在 iPad 3 上也能像在 Android 上一样快地运行 然而 事实证明事情比最初想象的要复杂 苹果开发者帐户
  • 获取 Windows 8 上的电池状态

    我在 Internet 上进行了搜索 发现唯一有一点帮助的是在 Windows Phone 8 上获取电池状态的方法 但我想要在 Windows 8 RT 上使用它 谁能帮我吗 根据我能找到的所有信息 我们无法访问 WinRT 中的 Pow
  • 单击单选按钮加载不同的局部视图

    我正在尝试根据单选按钮选择在单个 div 中加载不同的部分视图 当用户单击 个人 按钮时 应显示部分视图 如果单击 业务 则应显示业务部分视图 我的查看页面代码是
  • 如何让弹出窗口拦截器允许弹出窗口?

    如何让弹出窗口拦截器允许弹出窗口 通常 通过从用户生成的事件的事件处理程序中弹出它们 例如 如果您有一个链接并且用户明确单击它 并且您从onclick由于用户的显式操作 大多数弹出窗口阻止程序都会允许弹出窗口 相反 来自的弹出窗口windo
  • 从 jDateChooser 获取值并保存到 MS sql DB

    我的对话框上有两个 jDateChooser 我想保存到该数据类型有问题的 MS SQL DB 知道如何解决这个问题 仅当我将数据库中的数据类型转换为 nvarchar 并将值转换为从 jDateChooser 返回的字符串时 我才能执行此
  • Unity 中的 Firebase - 禁用持久性

    我正在使用 Firebase 制作 Android 手机游戏 该游戏有一个系统 允许玩家离线玩并根据保存的日期时间从数据库更新 检索数据 该日期时间 写入本地文件中 应该与数据库中保存的日期时间相同 为此 我编写了以下内容 referenc
  • NSDateComponents 问题 - 日期不正确

    我有一个 NSDateComponents 问题 我有两个 NSDate 我试图通过检查它们的年 月和日是否匹配来进行比较 我通过将 NSDate 值转换为这些整数分量来完成此操作 如下所示 NSDate cgiDate is previo
  • 如何从 C# 中的 JSON 字符串获取一些值?

    我有一个字符串 我想从中获取一些值 我的字符串看起来像 string1 r n id 100000280905615 r n name Jerard Jones r n first name Jerard r n last name Jon
  • 即使设置设为“从不”,iOS11 照片库也可以访问

    if UIImagePickerController isSourceTypeAvailable photoLibrary let imagePicker UIImagePickerController imagePicker source
  • android:识别ListView行中的单个项目?

    我在 ListActivity 中有一个由数据库表填充的 ListView ListView 的每一行都是一个relativelayout 其中包含三个依次命名为 rowid date 和 name 的 TextView 我可以使用 Lis
  • SwiftUI .sheet 视图调整大小问题(在 Macos 上测试)

    我有以下示例代码 import SwiftUI struct ContentView View State private var showModal false State private var hmm true var body so
  • protobuf 文本格式是什么样的?

    Google Protocol Buffers 不仅可以以二进制格式序列化 还可以序列化为文本 称为文本原型 然而 我无法轻易找到此类文本的示例 它会是什么样子 预期答案 一个涵盖 protobuf IDL proto 文件允许的所有功能的