windows环境下protobuf的java操作{编译,序列化,反序列化}

google protocol buffer的使用和原理

  • 概况:
    • Protocol Buffers(也就是protobuf)是谷歌的语言中立的、平台中立的、可扩展的用于序列化结构化的数据;
  • windows环境下的安装与使用:
    • protocol编译器
      1. 安装。安装protocol编译器,用来编译.proto文件;
        1. 下载。路径:https://github.com/google/protobuf/releases。里面有windows版的:protoc-3.6.1.win32.zip。
        2. 安装。
          • 下载完解压后,如果不想安装,可直接在cmd窗口进入解压得到的bin目录操作。
          • 安装,把bin目录copy下来,放到操作系统环境变量的path变量后面。
      2. 使用
        1. 自己编写proto文件。例如我这里写的文件:
          message demo{
              required int32 id = 1;
              required string name = 2;
              optional string email = 3;
              repeated string friends = 4;
              
          }
          View Code
        2. 编译:
          • 编译结果挺恶心的,一个只有几行代码的文件,编译结果动不动就是几千行几万行。。。
          • 编译命令示例:protoc --protopath D:lshdownloadprotoc-3.6.1-win32in --java_out ./ protoDemo.proto
            • protoc,编译命令;
            • --proto_path,就是你的proto文件所在目录是哪。我这里是D:lsh_downloadprotoc-3.6.1-win32in。
            • --java_out,标识输出的java文件应该放在哪个目录。这里的 ./ 是指当前目录。
            • protoDemo.proto,就是我们要编译的文件。
    • 关于protoc命令参数,大家可以在cmd窗口输入protoc --help 然后回车得到。
    • 安装protobuf,这里我选择maven安装。
      <dependency>
                  <groupId>com.google.protobuf</groupId>
                  <artifactId>protobuf-java</artifactId>
                  <version>3.6.0</version>
              </dependency>
      View Code
    • protobuf API的使用:
      • java文件,如上.proto文件得到的.java文件,我的文件名是ProtoDemo.java.
      • 调用API做什么?
        • 序列化;
        • 反序列化。
      • 编写序列化和反序列化代码如下:
        package demo.protobuf;
        
        import java.io.FileInputStream;
        import java.io.FileOutputStream;
        import java.io.IOException;
        
        import demo.protobuf.ProtoDemo.demo.Builder;
        
        public class SerialAndDesial {
            
            public static void main(String[] args) {
                Builder b = ProtoDemo.demo.newBuilder();
                b.setEmail("dave_peter@foxmail.com");
                b.setId(1);
                b.setName("lsh");
                
                ProtoDemo.demo protoDemo = b.build();
                
                    FileOutputStream output;
                    try {
                        //write
                        output = new FileOutputStream("proto.ser");
                        protoDemo.writeTo(output);
                        output.close();
                        
                        //read
                        ProtoDemo.demo protoDemo2 = ProtoDemo.demo.parseFrom(new FileInputStream("proto.ser"));
                        System.out.println(protoDemo2);
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
            }
        
        }
        View Code
      • 执行结果如下:

  • 参考资料:
原文地址:https://www.cnblogs.com/InformationGod/p/9479919.html