Protocol Buffers - 其他语言



我们一直在 Java 和 Python 中使用 Protocol Buffers。但是它支持多种语言,包括 C++、C#、Kotlin、Dart、Go 等。基本内容大致相同,即编写一个 proto 模式,通过我们代码可以使用的 protoc 二进制文件生成源代码。让我们在本节中为 GoDart 编写一个基本示例。

我们将使用以下 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

因此,正如我们所看到的,写入器 序列化并保存到文件的数据,被读取器正确地反序列化并相应地打印出来。

广告