惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Microsoft Azure Blog
Microsoft Azure Blog
WordPress大学
WordPress大学
小众软件
小众软件
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
V2EX
Hugging Face - Blog
Hugging Face - Blog
美团技术团队
博客园 - 三生石上(FineUI控件)
Last Week in AI
Last Week in AI
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - Franky
Microsoft Security Blog
Microsoft Security Blog
Y
Y Combinator Blog
A
About on SuperTechFans
The GitHub Blog
The GitHub Blog
U
Unit 42
H
Hackread – Cybersecurity News, Data Breaches, AI and More
云风的 BLOG
云风的 BLOG
IT之家
IT之家
MyScale Blog
MyScale Blog
V
Visual Studio Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
I
InfoQ
博客园 - 司徒正美

故事的程序猿

这个周末堪比加班: 带娃团建和露营⛺️ — 故事的程序猿 文章插图 Skill — 故事的程序猿 26 年 8 月总结 - 入园准备工作~ — 故事的程序猿 笑笑,正式入园 ✅ — 故事的程序猿 脚本解决雷池 WAF 的域名证书自动续签 — 故事的程序猿 嘿, 第一次瑞幸'幸运取餐码'「555」~ — 故事的程序猿 周末吃个大席,再磨点面~ — 故事的程序猿 啊!你黄了啊! — 故事的程序猿 大学基友我轩哥终于结婚啦🎉 — 故事的程序猿 南森 - 小鹿营地「周末露营」 — 故事的程序猿 26 年 7 月总结 - 好热丫,但丰富~ — 故事的程序猿 笑笑三岁生日的一天 — 故事的程序猿 骑行的尽头是折叠车,应验啦~ — 故事的程序猿 Vercel更新Waline(1.41.3)失败问题 — 故事的程序猿 SpringBoot下载文件打不开问题 — 故事的程序猿 博客升级,脱骨换皮~ — 故事的程序猿 26年6月总结-摆烂 先有潭柘寺,后有北京城~ 26年5月总结-咖啡拉花 装修灯具要注意⚠️ 26年4月总结-提前的假期 SpringBoot多PgSQL数据源的一种方式 带着女儿去广州长隆🚕✈️🦒🐼🐒🐨 长春小游 新功能添加:首页友链、画廊...【建站笔记】 26年3月总结-感冒了哦🤧 新手咖啡入坑指南!你真的需要一台咖啡机吗? 周日再来首钢园
使用Protobuf备份数据
猿1993👨🏻‍💻 · 2026-03-10 · via 故事的程序猿

· 阅读需 2 分钟

一个高效的序列化工具来备份数据,Protobuf 是一个不错的选择!

开源地址:https://github.com/protocolbuffers/protobuf

文 档:https://protobuf.dev/

安装protoc工具

首先安装Protobuf的工具,我使用的macbook,可以使用Homebrew安装。

安装完毕后验证:

protoc --version
libprotoc 3.21.5

定义描述文件

我使用的java,springboot工程。首先引入依赖

<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
</dependency>

定义描述文件,例如 Asset.proto

syntax = "proto3";
option java_package = "com.seatone.parse.proto";
option java_outer_classname = "AssetProto";
message Asset {
string id = 1;
string name = 2;
string standardTypeCode = 3;
}

然后使用工具生成对应的实体。

第一个参数为输出目录,第二个参数为描述文件。

protoc --java_out=./src/main/java/ ./src/main/resources/proto/Asset.proto

这样我们就可以利用这个对象来进行序列化和反序列化。

序列化和反序列化

@Test
public void protoToByteArray() throws InvalidProtocolBufferException {
byte[] byteArray = AssetProto.Asset.newBuilder()
.setId("l9L4T1Hps7tlses66AU")
.setName("abc")
.setStandardTypeCode("50101")
.build()
.toByteArray();
System.out.println(Arrays.toString(byteArray));

AssetProto.Asset asset = AssetProto.Asset.parseFrom(byteArray);
System.out.println(asset);
}

写入和读取文件

定义写入文件方法

/**
* 备份方法,流式写入 + GZIP
*/
public static void backupStream(List<?> data, String filePath) throws IOException {
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.INDENT_OUTPUT, false);
try (GZIPOutputStream gzip =
new GZIPOutputStream(new BufferedOutputStream(Files.newOutputStream(Paths.get(filePath))))) {
mapper.writeValue(gzip, data);
}
}

定义还原文件方法

/**
* 还原方法
*/
public static <T> T restore(String filePath, Class<T> type) throws IOException {
ObjectMapper mapper = new ObjectMapper();
try (GZIPInputStream gzip = new GZIPInputStream(Files.newInputStream(Paths.get(filePath)))) {
if (type.equals(List.class)) {
JavaType javaType = mapper.getTypeFactory().constructCollectionType(List.class, byte[].class);
return mapper.readValue(gzip, javaType);
} else {
return mapper.readValue(gzip, type);
}
}
}

最终:备份和还原数据

/**
* 备份数据到文件
*/
@Test
public void backupAsset() throws IOException {
List<byte[]> byteList = Lists.newArrayList(AssetProto.Asset.newBuilder()
.setId("l9L4T1Hps7tlses66AU")
.setName("abc")
.setStandardTypeCode("50101")
.build()
.toByteArray()
);
backupStream(byteList, backup_path);
}

/**
* 从文件还原数据
*/
@Test
public void restoreAsset() throws IOException {
List<byte[]> restore = restore(backup_path, List.class);
for (byte[] bytes : restore) {
AssetProto.Asset asset = AssetProto.Asset.parseFrom(bytes);
System.out.println(asset);
}
}

谷歌出品,稳定和效率都值得肯定!

文章标题:使用Protobuf备份数据

版权声明:内容遵守许可协议。转载请注明出处!

侵权提示:部分信息可能来源于网络。如发现有侵权,请随时联系删除!

感谢阅读,如果内容对你有用,请作者喝杯咖啡: