Protobuf - 在其他语言中
我们一直在 Java 和 Python 中使用 Protobuf。但它支持多种语言,包括 C++、C#、Kotlin、Dart、Go 等。基本内容基本保持不变,即编写 proto 模式,通过 protoc 二进制文件生成我们的代码可以使用的源代码。让我们在本节中为 Go 和 Dart 编写一个基本示例。
我们将使用以下 proto 文件 −
syntax = "proto3"; package tutorial; message Greet { string greeting = 1; string username = 2; }
在 Go Lang 中使用 Google Protobuf
要使用上述 Protobuf 文件,我们首先必须用 Go 语言生成 Greet 类的代码。为此,我们需要执行以下操作 −
安装 Go Protobuf 插件 (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 对象进行序列化和反序列化。
现在,让我们创建数据的 writer,它将以 username 和 greeting 作为输入。 −
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) }
现在让我们创建读取器来读取文件 −
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) }
reader 只是从同一个文件中读取,反序列化它,并打印有关问候的数据。
现在我们已经设置了 reader 和 writer,让我们编译项目。
接下来,让我们首先执行 writer −
go run Greeting_writer.go Saved greeting with following data to disk:: {greeting: Hello, username: John}
然后,让我们执行 reader−
go run greeting_reader.go Reading from file greeting_protobuf_output {greeting: Hello, username: John}
因此,我们可以看到,由 writer 序列化并保存到文件的数据,由 reader 正确反序列化并相应地打印。
在 Dart 中使用 Google Protobuf
要使用上述 Protobuf 文件,我们首先必须使用 Dart 语言安装并生成 Greet 类的代码。为此,我们需要执行以下操作 −
安装 Dart Protobuf 插件 (protoc-gen-go),这是我们一直使用的 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 对象进行序列化和反序列化。
现在,让我们创建数据的 writer,它将以 username 和 greeting 作为输入。−
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) }
接下来,让我们创建一个阅读器来读取文件 −
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
And then, let us execute the reader.
dart run greeting_reader.dart Reading from file greeting_protobuf_output greeting: Hello username: John
因此,我们可以看到,由writer序列化并保存到文件的数据,被 reader 正确地反序列化并打印出来。