当前位置: 首页 > wzjs >正文

做网站工资待遇如何简述seo的应用范围

做网站工资待遇如何,简述seo的应用范围,wordpress 有的管理员不能发布视频代码,用macbook做网站开发吗Protocol Buffers 全流程通俗讲解(从 0 到进阶) 目录 序列化到底为什么要选 Protobuf?核心原理:一眼看懂二进制编码10 分钟跑通「写 .proto → 生成代码 → 读写数据」.proto 文件 8 条黄金法则(小白友好版&…

Protocol Buffers 全流程通俗讲解(从 0 到进阶)

目录

  1. 序列化到底为什么要选 Protobuf?
  2. 核心原理:一眼看懂二进制编码
  3. 10 分钟跑通「写 .proto → 生成代码 → 读写数据」
  4. .proto 文件 8 条黄金法则(小白友好版)
  5. 典型使用场景 & 选型心法
  6. 高级语法:oneof / map / Any / packed / custom options
  7. 性能调优与常用工具
  8. 常踩的坑 + FAQ
  9. 与 JSON / FlatBuffers / Thrift 对比
  10. 结语:把 .proto 当成“团队契约”

1. 序列化到底为什么要选 Protobuf?

特性JSONXMLProtobuf
体积⚠️ 文本臃肿⚠️ 更臃肿🏆 最小(3–10 倍压缩)
编解码速度🏆 (少字符串解析)
数据自描述✅(键=名字)✅(Tag=编号+编码方式)
向后兼容⚠️ 改键就炸⚠️ 同上🏆 字段编号不变即可
多语言支持广广🏆 官方+CNCF 插件体系

一句话:Protobuf = 紧凑 + 快速 + 可演进 + 跨语言。


2. 核心原理:一眼看懂二进制编码

写数据 = 写 Tag + Value
Tag = (field_number << 3) | wire_type

wire_type代表含义典型字段
0Varint(变长整数)int32 / bool
164 bit 固定长fixed64 / double
2Length‑delimitedstring / bytes / 嵌套 message
532 bit 固定长fixed32 / float
  • Varint:按 7 bit 一段写,高位为 1 表示“后面还有”。小数字占 1 byte,大数字最多 10 byte。
  • ZigZag:把有符号整数映射成无符号,负数也能享受小体积。
  • Length‑delimited:先写长度,再写原始字节;字符串、嵌套消息全靠它。

解析器遇到 未知 Tag 直接跳过,所以旧代码能平稳处理新消息——这就是“向前兼容”的底气。


3. 10 分钟跑通「写 .proto → 生成代码 → 读写数据」

Windows + MSVC 为例,macOS/Linux 把 choco 换成 brewapt 即可。

3.1 安装编译器

choco install protoc        # 安装 protoc
protoc --version            # 确认 ≥ 25.x

3.2 编写 .proto

// file: tutorial/addressbook.proto
syntax = "proto3";package tutorial;           // 命名空间message Person {uint32 id        = 1;     // 编号必须唯一string name      = 2;string email     = 3;repeated string tags = 4; // 数组
}

3.3 一键生成 C++ 代码

protoc --cpp_out=. tutorial/addressbook.proto
# 得到 addressbook.pb.h / addressbook.pb.cc

3.4 编写 Demo

// file: demo.cpp
#include "addressbook.pb.h"
#include <fstream>
#include <iostream>int main() {GOOGLE_PROTOBUF_VERIFY_VERSION;        // ① 运行时版本兼容检查tutorial::Person p;                    // ② 构建消息p.set_id(1001);p.set_name("小明");p.set_email("xiaoming@example.com");*p.add_tags() = "vip";                 // ③ repeated 字段std::string bin;if (!p.SerializeToString(&bin)) {      // ④ 序列化std::cerr << "serialize failed\n";return 1;}std::ofstream("person.bin", std::ios::binary).write(bin.data(), bin.size());tutorial::Person q;q.ParseFromString(bin);                // ⑤ 反序列化std::cout << q.name() << " <" << q.email() << ">\n";google::protobuf::ShutdownProtobufLibrary();
}

3.5 编译运行

cl /EHsc demo.cpp addressbook.pb.cc ^/I"%ProgramFiles%\Google\protobuf\include" ^/link /LIBPATH:"%ProgramFiles%\Google\protobuf\lib" libprotobuf.lib
demo.exe

输出:小明 <xiaoming@example.com>

到此,你已经完成:写 .proto → 生成 .h/.cc → C++ 里序列化/反序列化。剩下只是把流程复制到实际项目中。


4. .proto 文件 8 条黄金法则(小白友好版)

#规则一句话通俗解释小示例
1编号与类型永不改编号像身份证;类型决定解析策略,改了旧代码全崩。id = 1int32 改成 string → 老版本读出来是乱码。
2常用字段放 1‑151‑15 的 Tag 只占 1 byte,省流量。聊天文本 content=2 比放 22 小一半字节。
3删除前先 reserved声明曾用号,不让后来误占。reserved 4, "old_name";
4文本用 string,文件用 bytesstring 默认 UTF‑8;bytes 纯二进制。头像用 bytes avatar = 5;
5远离 required升级难,proto3 直接砍掉。用 optional + 默认值。
6枚举值写非负整数建议首值 0 表示“未设置”。删除也要 reservedenum Role { ROLE_NONE = 0; ADMIN = 1; }
7package 决定命名空间防止不同模块类名冲突。package shop.order.v1;shop::order::v1::Order
8一文件一主题文件小、易审阅;版本用目录区分。user/v1/user.proto, order/v2/order.proto

5. 典型使用场景 & 选型心法

场景为什么适合 Protobuf?
微服务 RPCgRPC 默认载体,上下行小、延迟低。
移动/物联网蜂窝流量计费,节省字节就是省钱。
游戏帧同步每帧几十条消息,高频字段+变长整数特别省带宽。
Kafka 事件流搭 Schema Registry,自动验证版本兼容。
配置/缓存文件二进制快、也支持转 JSON 调试(官方 util)。

选型口诀
‑ 要“读时 0 拷贝”→ FlatBuffers/Cap’n Proto;
‑ 要“好写+可演进”→ Protobuf 一般最合适


6. 高级语法:oneof / map / Any / packed / custom options

6.1 oneof——互斥字段省字节

message Shape {oneof kind {Circle    circle = 1;Rectangle rect   = 2;}
}
  • 仅当前 set 的字段会写入字节流。
  • 判断类型:shape.kind_case() == Shape::kCircle

6.2 map<K,V>——原生字典

map<string, int32> scores = 3; // 隐式转成 repeated pair

关键点:Key 不可用浮点 / bytes / message。

6.3 Any——动态消息载体

import "google/protobuf/any.proto";
google.protobuf.Any body = 4;

使用:

google::protobuf::Any any;
any.PackFrom(myMessage);      // 序列化
MyType msg;
any.UnpackTo(&msg);           // 反序列化

6.4 packed——批量数字压缩

repeated int32 points = 5 [packed = true]; // 在 proto3 默认已开启

6.5 custom options——自定义注解

extend google.protobuf.FieldOptions {bool sensitive = 50001;
}message User {string phone = 1 [(sensitive) = true];
}

配合反射可自动做日志脱敏。


7. 性能调优与常用工具

技巧 / 工具效果
Arena批量对象一次性分配/回收,减 GC。
Lite runtime--cpp_out=lite:,体积 ↓60%,去掉反射。
Zero‑copy IOSerializeToZeroCopyStream 少一次内存复制。
BufLint + 违规变更检测 + 远端缓存。
protoc‑gen‑doc自动生成 HTML/Markdown 文档。
protoc --decode_raw“盲拆”调试二进制,快速定位字段。

8. 常踩的坑 + FAQ

  1. 64 bit 整数在 JS 会丢精度?
    Protobuf‑JSON 映射会把 int64/uint64 转成字符串返回,保持精度。
  2. 字段顺序能随便调吗?
    ,只影响字节大小,不影响兼容;Tag 才是硬指标。
  3. 大包 (>4 MiB) gRPC 传不动?
    调服务器 grpc.max_receive_message_length 或改流式 RPC。
  4. 反射 API 很慢?
    生产环境少用;必要时切 Lite runtime + 手写访问器。

9. 与 JSON / FlatBuffers / Thrift 对比

方案体积编解码读时 0 拷贝演进友好主要场景
Protobuf★★★★★★★★★★★★RPC、事件流
JSON★★★★★★★调试、人机交互
FlatBuffers★★★★★★★★★★★★移动游戏、MMAP
Cap’n Proto★★★★★★★★★★★★★IPC、嵌入式
Thrift★★★★★★★★★★老系统、金融行业

10. 结语:把 .proto 当成“团队契约”

  1. 字段编号 = 合同条款号,定下来就别改。
  2. 类型定义 = 条款内容,变动必须所有微服务一起升级。
  3. protoc = 自动翻译官,让 C++/Java/Python 都读同一本合同。
http://www.dtcms.com/wzjs/78582.html

相关文章:

  • 手机端怎么打开响应式的网站阳东网站seo
  • 建设公司网站多少钱手机如何建网站
  • 制作网站团队人员最新的全国疫情
  • 陕西省建设工程质量监督局网站网络服务有哪些
  • 温州建站平台网络舆情
  • 如何做阿语垂直网站济南百度推广开户
  • 个人网站费用文案发布平台
  • 网站建设链接怎么加上去优化大师使用心得
  • 灰色网站建设百度搜索风云榜小说排行榜
  • 共享ip服务器做网站外贸网络推广服务
  • phpcms 生成网站地图怎样做线上销售
  • 咋么做进网站跳转加群永久免费google搜索引擎
  • 安监网站如何做紧急预案备案今天新闻最新消息
  • 佛山营销网站建设制作搜索引擎优化中的步骤包括
  • 外贸 网站 模板产品线上营销有哪些方式
  • node 网站开发网络营销的渠道
  • 简洁企业网站asp营销网店推广的软文
  • 有源码搭建网站难不难陕西百度推广的代理商
  • 做网站自己装服务器常见的搜索引擎
  • 做哪类网站没有版权问题网络营销总结及体会
  • 中国建设厅网站我要下载百度
  • 营销型网站的作用是seo团队管理系统
  • 哈尔滨微信网站建设百度帐号登录个人中心
  • 怎么做一个论坛网站微信广告投放平台
  • 邵阳企业网站建设网络推广公司企业
  • 票据理财网站建设市场调研报告
  • 微信扫码即可打开的网站如何做合肥今日头条新闻
  • 建公司网站要提供哪些素材搜seo
  • 日文网站建设百度联盟项目看广告挣钱
  • l网站建设怎样在百度上做广告