【笔记】Protobuf的应用

前言

Protobuf在各种编程语言中的应用

定义Protobuf

User.proto
1
2
3
4
5
syntax = "proto3";

message User {
string username = 1;
}

Java

生成Java代码

1
protoc --java_out=. User.proto

引入依赖

pom.xml
1
2
3
4
5
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>4.29.3</version>
</dependency>

序列化

1
2
3
4
UserOuterClass.User user = UserOuterClass.User.newBuilder()
.setUsername("value")
.build();
byte[] message = user.toByteArray();

反序列化

buf:二进制数据

1
2
UserOuterClass.User user = UserOuterClass.User.parseFrom(buf);
System.out.println(user.getUsername()); // "value"

Python3

生成Python代码

1
protoc --python_out=. User.proto

下载依赖

1
pip install protobuf

引入依赖

1
from User_pb2 import User

序列化

1
2
3
user = User()
user.username = "value"
message = user.SerializeToString()

反序列化

buf:二进制数据

1
2
3
user = User()
user.ParseFromString(buf)
print(user.username) # "value"

Nodejs

生成JS代码

1
2
npm install -g protoc-gen-js
protoc --js_out=import_style=commonjs,binary:. User.proto

下载依赖

1
2
npm install google-protobuf
npm install protobufjs

引入依赖

1
const User = require("./User_pb");

序列化

1
2
3
const user = new User.User();
user.setUsername("value");
const message = user.serializeBinary();

反序列化

buf:二进制数据

1
2
const user = User.User.deserializeBinary(buf);
console.log(user.getUsername()); // "value"

C#

生成C#代码

1
protoc --csharp_out=. User.proto

引入依赖

1
2
3
4
<ItemGroup>
<PackageReference Include="Google.Protobuf" Version="3.21.12" />
<PackageReference Include="Grpc.Tools" Version="2.44.0" />
</ItemGroup>

序列化

1
2
3
4
5
User user = new User
{
Username = "value"
};
byte[] message = user.ToByteArray();

反序列化

buf:二进制数据

1
2
User user = User.Parser.ParseFrom(buf, 0, bytesRead);
Console.WriteLine(user.Username); // "value"

完成