为什么要使用protobuf
protobuf提供了效率、灵活性和易用性之间的平衡,使其成为各种场景(包括微服务、分布式系统和网络通信)中数据序列化和交换的有吸引力的选择
配置环境
- 安装protobuf
- 配置环境变量
- 引入类库
- protoc_plugin
- protobuf
protobuf: ^3.1.0
protoc_plugin: ^21.1.2
编写proto描述文件-person.proto
syntax = "proto3";
import "google/protobuf/timestamp.proto";
message Person {
string name = 1;
int32 id = 2; // Unique ID number for this person.
string email = 3;
enum PhoneType {
PHONE_TYPE_UNSPECIFIED = 0;
PHONE_TYPE_MOBILE = 1;
PHONE_TYPE_HOME = 2;
PHONE_TYPE_WORK = 3;
}
message PhoneNumber {
string number = 1;
PhoneType type = 2;
}
repeated PhoneNumber phones = 4;
google.protobuf.Timestamp last_updated = 5;
}
// Our address book file is just one of these.
message AddressBook {
repeated Person people = 1;
}
编译生成dart文件
protoc --dart_out=. google/protobuf/timestamp.proto
protoc --dart_out=. ./*.proto
使用
test('test Proto', () async {
final m1 = Person.create()..name = "李四"..id=5..email="123444"..phones.add(Person_PhoneNumber(
number: "123456",
type: Person_PhoneType.PHONE_TYPE_HOME,
))..lastUpdated = Timestamp(seconds: $fixnum.Int64.parseInt((DateTime.now().millisecondsSinceEpoch~/1000).toString()));
final result = m1.writeToBuffer();
print(m1.toString());
print(m1.name);
final p2 = Person.fromBuffer(result);
p2.name = "张三";
final result2 = p2.writeToBuffer();
print(result2);
print(p2.name);
});