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 正确地反序列化并打印出来。

