protobuf快速使用

什么是protobuf

简单讲就是一种类似于json,xml的通用数据交换格式,但是效率更高,更省空间,目前官方支持c++,java,python,ruby。其他语言有一些第三方做的开发包,需要自己选择比较好的。

Ubuntu下快速使用

  1. 下载
    google或者github

  2. 编译
    2.1 编译protoc工具,这里可以直接看解压出来的protobuf-2.6.0文件夹下的README.txt文件,这里需要有c++编译器
    $ ./configure $ make $ make check $ make install
    2.2 测试安装
    $ protoc --version
    如果无法运行提示 error while loading shared libraries,我们可以直接把protoc默认安装的共享库文件路径直接加入到共享库配置文件中去(实际上很多开源软件的共享库文件默认安装的位置也在/usr/local/lib下)
    $ echo "/usr/local/lib" >> /etc/ld.so.conf $ ldconfig
    再执行一下应该就可以了
    $ protoc --version

  3. java使用示例
    3.1 把java源代码编译成我们方便使用的jar包形式,这里需要用到maven,没有的话可以在这里下载apache,安装说明这页上也有
    3.2 打包,先test一下
    $ mvn test
    通过了的话直接
    $ mvn package
    在target目录下就能看到打完包的protobuf-java-2.6.0.jar文件了
    3.3 用protoc工具将.proto文件生成java类
    这里直接用刚刚下载的protobuf-2.6.0中example文件夹下的addressbook.proto文件作为示例
    $ protoc -I=$SRC_DIR --java_out=$DST_DIR $SRC_DIR/addressbook.proto
    上面的$SRC_DIR表示存放addressbook.proto文件的路径,$DST_DIR表示生成java类存放的路径
    至此将protobuf-java-2.6.0.jar和刚刚生成的AddressBookProtos.java文件引用到你自己的项目中就可以了

  4. 使用
    4.1 写:AddPerson.java,为了方便直接在IDE里面使用,对官网程序做了一点修改,直接运行输入Person的相关信息就好了

     package com.example.tutorial;
    
     import java.io.BufferedReader;
     import java.io.FileInputStream;
     import java.io.FileNotFoundException;
     import java.io.FileOutputStream;
     import java.io.IOError;
     import java.io.IOException;
     import java.io.InputStreamReader;
     import java.io.PrintStream;
    
     import com.example.tutorial.AddressBookProtos.AddressBook;
     import com.example.tutorial.AddressBookProtos.Person;
    
     public class AddPerson {
    
         // This function fills in a Person message based on user input.
         static Person PromptForAddress(BufferedReader stdin, PrintStream stdout)
                 throws IOException {
             Person.Builder person = Person.newBuilder();
    
             stdout.print("Enter person ID: ");
             person.setId(Integer.parseInt(stdin.readLine()));
    
             stdout.print("Enter name: ");
             person.setName(stdin.readLine());
    
             stdout.print("Enter email address (blank for none)");
             String email = stdin.readLine();
             if (email.length() > 0) {
                 person.setEmail(email);
             }
    
             while (true) {
                 stdout.print("Enter a phone number (or leave blank to finish): ");
                 String number = stdin.readLine();
                 if (number.length() == 0) {
                     break;
                 }
    
                 Person.PhoneNumber.Builder phoneNumber = Person.PhoneNumber
                         .newBuilder().setNumber(number);
    
                 stdout.print("Is this a mobile, home, or work phone? ");
                 String type = stdin.readLine();
                 if (type.equals("mobile")) {
                     phoneNumber.setType(Person.PhoneType.MOBILE);
                 } else if (type.equals("home")) {
                     phoneNumber.setType(Person.PhoneType.HOME);
                 } else if (type.equals("work")) {
                     phoneNumber.setType(Person.PhoneType.WORK);
                 } else {
                     stdout.println("Unknown phone type.  Using default.");
                 }
    
                 person.addPhone(phoneNumber);
             }
    
             return person.build();
    
         }
    
         // Main function: Reads the entire address book from a file,
         // adds one person based on user input, then writes it back out to the same
         // file.
         public static void main(String[] args) throws Exception {
     //      if (args.length != 1) {
     //          System.err.println("Usage:  AddPerson ADDRESS_BOOK_FILE");
     //          System.exit(-1);
     //      }
     
             String filePath = "myPerson";
    
             AddressBook.Builder addressBook = AddressBook.newBuilder();
    
             // Read the existing address book.
             try {
                 addressBook.mergeFrom(new FileInputStream(filePath));
             } catch (FileNotFoundException e) {
                 System.out.println(filePath
                         + ": File not found.  Creating a new file.");
             }
    
             // Add an address.
             addressBook.addPerson(PromptForAddress(new BufferedReader(
                     new InputStreamReader(System.in)), System.out));
    
             // Write the new address book back to disk.
             FileOutputStream output = new FileOutputStream(filePath);
             addressBook.build().writeTo(output);
             output.close();
         }
    
     }
    

4.2 读:可以读取刚刚写在文件里的Person

    package com.example.tutorial;

    import java.io.FileInputStream;

    import com.example.tutorial.AddressBookProtos.AddressBook;
    import com.example.tutorial.AddressBookProtos.Person;

    public class ListPeople {

        // Iterates though all people in the AddressBook and prints info about them.
        static void Print(AddressBook addressBook) {
            for (Person person : addressBook.getPersonList()) {
                System.out.println("Person ID: " + person.getId());
                System.out.println("  Name: " + person.getName());
                if (person.hasEmail()) {
                    System.out.println("  E-mail address: " + person.getEmail());
                }

                for (Person.PhoneNumber phoneNumber : person.getPhoneList()) {
                    switch (phoneNumber.getType()) {
                    case MOBILE:
                        System.out.print("  Mobile phone #: ");
                        break;
                    case HOME:
                        System.out.print("  Home phone #: ");
                        break;
                    case WORK:
                        System.out.print("  Work phone #: ");
                        break;
                    }
                    System.out.println(phoneNumber.getNumber());
                }
            }
        }

        // Main function: Reads the entire address book from a file and prints all
        // the information inside.
        public static void main(String[] args) throws Exception {
            String filePath = "myPerson";

            // Read the existing address book.
            AddressBook addressBook = AddressBook.parseFrom(new FileInputStream(filePath));

            Print(addressBook);
        }

    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,911评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,014评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,129评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,283评论 1 264
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,159评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,161评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,565评论 3 382
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,251评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,531评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,619评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,383评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,255评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,624评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,916评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,199评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,553评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,756评论 2 335

推荐阅读更多精彩内容