Protocol Buffers学习笔记 - Windows上搭建开发环境,开发Java序列化应用

Google Protocol Buffers (ProtoBuf)是Google开源的数据序列化工具/框架/方法,比使用XML更小、更快、也更简单高效。目前Hadoop, HBase等很多开源软件使用ProtoBuf作为序列化工具。官方网站: https://developers.google.com/protocol-buffers/

在Windows上搭建Protobuf Java实验环境需要如下软件:

1. MS Visual Studio C++ (编译protoc, optional)

2. JDK (编译Java源码)

3. Maven (build protobuf jar包)

第一步:下载源码及Windows下编译好的protoc.exe, 下载地址:https://developers.google.com/protocol-buffers/docs/downloads

如果你的Windows上安装了Visual Studio,就可以不用下载protoc.exe,可以用源码编译出protoc。博主的电脑上没有Visual Studio, 因此直接下载了protoc.exe

第二步:下载及安装Maven,  Maven官网:http://maven.apache.org/

安装后将maven的bin目录设置到Window path环境变量下

第三步:编译protobuf jar包

将下载的protoc.exe放到src目录,然后进入java目录运行:

mvn package

在target目录下产生protobuf-java-2.6.0.jar

mvn install

将jar包安装到maven repository.

至此我们得到了开发protobuf Java应用需要的protoc.exe和protobuf-java-2.6.0.jar, 这是我们开发protobuf Java应用仅需要的2个文件。下面就可以开发应用了。


Protobuf Java应用开发

1. 创建项目

mvn archetype:generate -DgroupId=proto -DartifactId=ProtobufTest

并生成eclipse项目:

mvn eclipse:eclipse

然后用eclipse打开项目, 进入Eclipse, Import -> Existing Maven Projects

2. 创建proto文件

在proto包中创建文件addressbook.proto,内容如下:

package proto.generated;

option java_package = "proto.generated";
option java_outer_classname = "AddressBookProtos";

message Person {
  required string name = 1;
  required int32 id = 2;
  optional string email = 3;

  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }

  message PhoneNumber {
    required string number = 1;
    optional PhoneType type = 2 [default = HOME];
  }

  repeated PhoneNumber phone = 4;
}

message AddressBook {
  repeated Person person = 1;
}
3. 编译proto文件
进入proto目录运行:
protoc --java_out=..\ addressbook.proto
在generated目录下生成了AddressBookProtos.java
添加依赖到pom.xml中:
   <dependency>
      <groupId>com.google.protobuf</groupId>
      <artifactId>protobuf-java</artifactId>
      <version>2.6.0</version>
    </dependency>


5. 测试写消息(序列化)
在proto包中创建如下Java类 AddPerson.java
package proto;
import proto.generated.AddressBookProtos.AddressBook;
import proto.generated.AddressBookProtos.Person;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

class AddPerson {
  static Person newPerson() {
    Person.Builder person = Person.newBuilder();

    person.setId(1);
    person.setName("Mike");
    person.setEmail("mike@abc.com");

    Person.PhoneNumber.Builder phoneNumber =
        Person.PhoneNumber.newBuilder().setNumber("12388888888");
      phoneNumber.setType(Person.PhoneType.MOBILE);
      person.addPhone(phoneNumber);

    return person.build();
  }

  public static void main(String[] args) throws Exception {
    AddressBook.Builder addressBook = AddressBook.newBuilder();

    // Read the existing address book.
    try {
      addressBook.mergeFrom(new FileInputStream(args[0]));
    } catch (FileNotFoundException e) {
      System.out.println(args[0] + ": File not found.  Creating a new file.");
    }

    // Add an address.
    addressBook.addPerson(AddPerson.newPerson());

    // Write the new address book back to disk.
    FileOutputStream output = new FileOutputStream(args[0]);
    addressBook.build().writeTo(output);
    output.close();
  }
}
添加一个命令行参数运行,运行后产生序列化文件。
6. 测试读消息(反序列化)
在proto包中创建如下Java类ListPeople.java
package proto;
import proto.generated.AddressBookProtos.AddressBook;
import proto.generated.AddressBookProtos.Person;
import java.io.FileInputStream;

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 {
    if (args.length != 1) {
      System.err.println("Usage:  ListPeople ADDRESS_BOOK_FILE");
      System.exit(-1);
    }

    // Read the existing address book.
    AddressBook addressBook =
      AddressBook.parseFrom(new FileInputStream(args[0]));

    Print(addressBook);
  }
}
添加与写消息时相同的命令行参数,运行后显示刚刚写入的消息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值