- Protocol Buffers 教程
- Protocol Buffers - 首页
- Protocol Buffers - 简介
- Protocol Buffers - 基本应用
- Protocol Buffers - 结构
- Protocol Buffers - 消息 (message)
- Protocol Buffers - 字符串 (string)
- Protocol Buffers - 数字
- Protocol Buffers - 布尔值 (bool)
- Protocol Buffers - 枚举 (enum)
- Protocol Buffers - 重复字段 (repeated)
- Protocol Buffers - 映射 (map)
- Protocol Buffers - 嵌套类
- Protocol Buffers - 可选字段和默认值
- Protocol Buffers - 语言无关性
- Protocol Buffers - 复合数据类型
- Protocol Buffers - 命令行用法
- Protocol Buffers - 更新定义规则
- Protocol Buffers - 与 Kafka 集成
- Protocol Buffers - 其他语言
- Protocol Buffers 有用资源
- Protocol Buffers - 快速指南
- Protocol Buffers - 有用资源
- Protocol Buffers - 讨论
Protocol Buffers - 其他语言
我们一直在 Java 和 Python 中使用 Protocol Buffers。但是它支持多种语言,包括 C++、C#、Kotlin、Dart、Go 等。基本内容大致相同,即编写一个 proto 模式,通过我们代码可以使用的 protoc 二进制文件生成源代码。让我们在本节中为 Go 和 Dart 编写一个基本示例。
我们将使用以下 proto 文件:
greeting.proto
syntax = "proto3"; package tutorial; message Greet { string greeting = 1; string username = 2; }
在 Go 语言中使用 Google Protocol Buffers
要使用上述 Protocol Buffers 文件,我们首先需要为 Go 语言中的 Greet 类生成代码。为此,我们需要执行以下操作:
安装 Go Protocol Buffers 插件 (protoc-gen-go),这是我们一直在使用的 protoc 文件的先决条件:
go install google.golang.org/protobuf/cmd/protoc-gen-go
然后,使用提供的 ".proto" 文件运行 protoc,我们将指示它在 "go" 目录下生成代码。
protoc --go_out=go proto_files/greeting.proto
执行上述命令后,您会注意到一个自动生成的类:"greeting.pb.go"。此类将帮助我们对 Greet 对象进行序列化和反序列化。
现在,让我们创建数据的 写入器,它将接收 用户名 和 问候语 作为输入:
greeting_writer.go
import "fmt" import "io/ioutil" func main() { greet := Greeting{} greet.username = "John" greet.greeting = "Hello" out, err := proto.Marshal(greet) ioutil.WriteFile("greeting_go_out", out , 0644) fmt.Println("Saved greeting with following data to disk:") fmt.Println(p) }
现在让我们创建读取文件的 读取器:
greeting_reader.go
import "fmt" import "io/ioutil" func main() { in, err := ioutil.ReadFile("greeting_go_out") greet := &pb.Greet{} proto.Unmarshal(in, greet) fmt.Println("Reading from file greeting_protobuf_output:") fmt.Println(greet) }
输出
读取器 简单地从同一文件读取数据,对其进行反序列化,然后打印问候信息。
现在我们已经设置了 写入器 和 读取器,让我们编译项目。
接下来,让我们首先执行 写入器:
go run greeting_writer.go Saved greeting with following data to disk: {greeting: Hello, username: John}
然后,让我们执行 读取器:
go run greeting_reader.go Reading from file greeting_protobuf_output {greeting: Hello, username: John}
因此,正如我们所看到的,写入器 序列化并保存到文件的数据,被 读取器 正确地反序列化并相应地打印出来。
在 Dart 中使用 Google Protocol Buffers
要使用上述 Protocol Buffers 文件,我们首先需要安装并为 Dart 语言中的 Greet 类生成代码。为此,我们需要执行以下操作:
安装 Dart Protocol Buffers 插件 (protoc-gen-dart),这是我们一直在使用的 protoc 文件的先决条件。 https://github.com/dart-lang/protobuf/tree/master/protoc_plugin#how-to-build-and-use
然后,使用提供的 ".proto" 文件运行 protoc,我们将指示它在 "dart" 目录下生成代码。
protoc --go_out=dart proto_files/greeting.proto
执行上述命令后,您会注意到一个自动生成的类:"greeting.pb.dart"。此类将帮助我们对 Greet 对象进行序列化和反序列化。
现在,让我们创建数据的 写入器,它将接收 用户名 和 问候语 作为输入:
greeting_writer.dart
import 'dart:io'; import 'dart/greeting.pb.dart'; main(List arguments) { Greeting greet = Greeting(); greet.greeting = "Hello"; greet.username = "John"; File file = File("greeting_go_out"); print("Saved greeting with following data to disk:") file.writeAsBytes(greet.writeToBuffer()); print(greet) }
接下来,让我们创建一个读取文件的 读取器:
greeting_reader.dart
import 'dart:io'; import 'dart/greeting.pb.dart'; main(List arguments) { File file = File("greeting_go_out"); print("Reading from file greeting_protobuf_output:") Greeting greet = Greeting.fromBuffer(file.readAsBytesSync()); print(greet) }
输出
读取器 简单地从同一文件读取数据,对其进行反序列化,然后打印 问候信息。
现在我们已经设置了 写入器 和 读取器,让我们编译项目。
接下来,让我们首先执行 写入器:
dart run greeting_writer.dart Saved greeting with following data to disk: greeting: Hello username: John
然后,让我们执行 读取器。
dart run greeting_reader.dart Reading from file greeting_protobuf_output greeting: Hello username: John
因此,正如我们所看到的,写入器 序列化并保存到文件的数据,被读取器正确地反序列化并相应地打印出来。