ubuntu下快速使用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
    上面的 SRCDIRaddressbook.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);
        }

    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值