proto文件格式

syntax="proto2" #语法格式

package tutorial; #包

#option:可赋值非必须赋值 java_package:java包名
option java_package = "com.example.tutorial";
#java类名,生成com.example.tutorial.AddressBookProtos java类
option java_outer_classname = "AddressBookProtos";
option csharp_namespace = "Google.ProtocolBuffers.Examples.AddressBook";

#message定义所需要序列化的数据的格式。每一个Message都是一个小的信息逻辑单元,
#包含了一些列的name-value对。
message Person {
  required string name = 1; #required必须赋值,是永久性的
  required int32 id = 2;        // Unique ID number for this person.
  optional string email = 3;

  enum PhoneType { #枚举
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }

  message PhoneNumber {
    required string number = 1;
    optional PhoneType type = 2 [default = HOME];
  }
   
  #repeated类似数组或集合(java里是list)
  repeated PhoneNumber phone = 4;
}

// Our address book file is just one of these.
message AddressBook {
  repeated Person person = 1;
}


protobuf序列化结构化数据,比起XML的优点:

  1. 更简单
  2. 比XML小3~10倍
  3. 比XML快20~100倍
  4. 语义定义明确
  5. 自动生成数据存取类,更容易使用

缺点:

  1.  XML能更直观多标签的描述。
  2.  XML是子描述的,可以随机且交错读取读取文本节点。
  3.  XML是自描述的,而protobuf不是,protobuf必须要有格式定义文件(.proto 文件)。


转载于:https://my.oschina.net/haoqoo/blog/467409

### 什么是 Protocol Buffers 的 proto 文件? Protocol Buffers(简称 Protobuf)是一种用于序列化结构化数据的灵活、高效且自动化的机制。Proto 文件是定义 Protocol Buffers 消息类型的文件,它描述了消息的字段及其类型[^2]。 Proto 文件使用 `.proto` 扩展名,并通过 Proto 编译器将其转换为多种编程语言的代码。这些生成的代码可以用于操作相应的协议缓冲区,包括序列化和解析消息[^3]。 ### Proto 文件的基本结构 Proto 文件通常包含以下内容: 1. **消息定义**:消息是以 `message` 关键字开头的结构,定义了字段名称和字段类型。 2. **字段编号**:每个字段都有一个唯一的编号,用于标识该字段在序列化后的二进制格式中的位置。 3. **字段修饰符**:字段可以是 `optional`(可选)、`required`(必需)或 `repeated`(重复)。需要注意的是,`required` 已被弃用,建议使用 `optional` 或 `repeated`。 以下是一个简单的 `Person` 消息定义示例: ```proto message Person { optional string name = 1; optional int32 id = 2; optional string email = 3; } ``` ### 使用生成的代码操作 Protocol Buffers 消息 通过 Proto 编译器生成代码后,可以使用生成的类来创建、修改和序列化消息。以下是一个 Java 示例,展示如何使用生成的代码[^3]: ```java Person john = Person.newBuilder() .setId(1234) .setName("John Doe") .setEmail("jdoe@example.com") .build(); try (FileOutputStream output = new FileOutputStream("person.bin")) { john.writeTo(output); } ``` ### 跨语言兼容性 Proto 文件的一个重要特性是其跨语言兼容性。通过调用 Proto 编译器,可以为不同的编程语言生成代码,例如 C++、Java、Python 等。这使得 Protocol Buffers 成为分布式系统中数据交换的理想选择[^3]。 ### CODE_SIZE 和 SPEED 模式 在生成 Protocol Buffers 代码时,可以选择不同的模式以优化性能或代码大小。例如,`CODE_SIZE` 模式会生成更小的代码量,但运行速度较慢,适用于包含大量 `.proto` 文件的应用程序;而 `SPEED` 模式则优先考虑性能,生成的代码更大但执行更快[^4]。 ### 总结 Proto 文件是 Protocol Buffers 的核心定义文件,用于描述消息结构。通过 Proto 编译器生成的代码,可以在不同编程语言中操作这些消息,实现高效的序列化和解析功能。此外,Proto 文件支持扩展性和向后兼容性,确保新版本不会破坏旧数据[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值