Protobuf - 在其他语言中

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

我们将使用以下 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,它将以 usernamegreeting 作为输入。 −

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 只是从同一个文件中读取,反序列化它,并打印有关问候的数据。

现在我们已经设置了 readerwriter,让我们编译项目。

接下来,让我们首先执行 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,它将以 usernamegreeting 作为输入。−

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