Google protobuf是一种可以替换Java序列化的技术,该技术有以下几种优势:

  1. 跨语言,可以支持Java, C++和Python
  2. 速度快,序列化的速度更快一些
  3. 体积小, 相比于Java生成的序列化数据长度,Protobuf的序列化结果长度小很多。

使用IntelliJ IDEA生成proto文件

  1. 写出类的proto文件代码
package NettyStudy;
option java_package = "protobuf";
option java_outer_classname = "UserInfoProto";

message UserInfo{
    required int64 id = 1;
    required string name = 2;
}
  1. 在Maven中引入包 ```Xml
4.0.0 ca.mcmaster netty 1.0-SNAPSHOT 1.6.1 3.3.0 org.apache.maven.plugins maven-compiler-plugin 7</source> 7 org.xolstice.maven.plugins protobuf-maven-plugin 0.5.0 com.google.protobuf:protoc:${protobuf.version}:exe:${os.detected.classifier} grpc-java io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier} compile compile-custom kr.motd.maven os-maven-plugin 1.5.0.Final com.google.protobuf protobuf-java ${protobuf.version} io.grpc grpc-netty ${grpc.version} provided io.grpc grpc-protobuf ${grpc.version} provided io.grpc grpc-stub ${grpc.version} provided com.google.protobuf protobuf-java ${protobuf.version} com.googlecode.protobuf-java-format protobuf-java-format 1.4

3. View->Tool Windows->Maven projects->protobuf->protobuf:compile, 就会在target中生成编译成的java文件。
4. 将java文件考入对应的包中。

### 使用protobuf序列化和反序列化对象
```Java
public class UserInfoProtoTest {

    /**
     * 将对象序列化。
     * @param userInfo
     * @return
     */
    private static byte[] encode(UserInfoProto.UserInfo userInfo){
        return userInfo.toByteArray();
    }

    /**
     * 将序列化的对象反序列化。
     * @param bytes
     * @return
     * @throws InvalidProtocolBufferException
     */
    private static UserInfoProto.UserInfo decode(byte[] bytes) throws InvalidProtocolBufferException {
        return UserInfoProto.UserInfo.parseFrom(bytes);
    }

    /**
     * 生成对象并进行注入。
     * @return
     */
    private static UserInfoProto.UserInfo createUserInfo(){
        UserInfoProto.UserInfo.Builder builder = UserInfoProto.UserInfo.newBuilder();
        builder.setId(10L);
        builder.setName("SeanForFun");
        return builder.build();
    }
    public static void main(String[] args) throws InvalidProtocolBufferException {
        UserInfoProto.UserInfo info = createUserInfo();
        System.out.println(info);
        UserInfoProto.UserInfo info1 = decode(encode(info));
        System.out.println(info1.toString());
    }
}

引用

  1. protobuf 和 intellij 配置使用