Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。这里是Protobuf的官方手册 https://developers.google.cn/protocol-buffers/docs/overview
序列化协议考虑哪些点
为什么很多RPC框架底层会使用Protobuf协议作为序列化协议呢?我们不难想到,对于一个PRC框架来说,如果能以比较少的数据传输量传达更多的信息,并且序列化和反序列化的速度肯定是越快越好,而且如果具备跨语言的特性就更好,所以总结一下:
1、序列化之后的码流大小(占用网络带宽)字节长度
2、序列化和反序列化的性能(CPU资源占用)
3、是否支持跨语言
Protobuf相对于其他格式,Protobuf解析速度快(即序列化反序列化速度快),占用空间小,以及兼容性好,很适合做数据存储或网络通讯间的数据传输。
其他的一些序列化协议
- JSON
- XML
- Hessian
- Thrift
- Kryo
- protostuff
- ….
- Protobuf-google开源的
Java原生的序列化操作
先通过一个示例来看看Java的原生序列化是如何使用的:
public class Teacher implements Serializable {
private static final long serialVersionUID = 8619259453444471644L;
private long teacherId;
private String name;
private int age;
private List<String> courses = new ArrayList<>();
public Teacher(long teacherId, String name, int age) {
this.teacherId = teacherId;
this.name = name;
this.age = age;
}
// getter and setter...
public String toString() {
return "Teacher{" +
"teacherId=" + teacherId +
", name='" + name + '\'' +
", age=" + age +
", courses=" + courses +
'}';
}
}
现在来测试一下Java的原生序列化:
public class SerialTest {
public