Google protobuf 学习

protobuf相当xml作用,但是比xml更加灵活,而且解析起了比xml方便,速度快

 

第一步我们可以要protobuf的jar包

高手可以自己下载源码打jar包,菜鸟直接上网上下载个现成的jar(嘿嘿~我就是在网上直接下载的jar)

把jar包导入到项目里面

在上官网下载对应的protoc.exe编译工具,copy到项目的src目录下

把.proto文件放到src目录下

例如:

addressbook.proto

 

package tutorial; 
option java_package = "com.example.tutorial"; 
option java_outer_classname = "AddressBookProtos"; 
message Person { 
required string name = 1; 
required int32 id = 2;        // Unique ID number for this person. 
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; 

// Our address book file is just one of these. 
message AddressBook { 
repeated Person person = 1; 

 

现在打开命令窗口 进入项目的src目录下

执行命令 protoc --java_out=. addressbook.proto(注意.后面有个空格哦)

现在就生成了AddressBookProtos.java文件

 

 

好了现在我们就写个test 吧!

 

package com.example.tutorial;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;

import org.junit.Test;

import com.example.tutorial.AddressBookProtos.Person.PhoneNumber;
import com.example.tutorial.AddressBookProtos.Person.PhoneType;
import com.google.protobuf.DescriptorProtos.FieldDescriptorProto;
import com.google.protobuf.Descriptors.FieldDescriptor;

public class AddPersonTest {

    public static void main(String[] args) throws Exception {

        //序列化到文件
        AddressBookProtos.Person.Builder builder = AddressBookProtos.Person
                .newBuilder();
        builder.setEmail("abc");
        builder.setName("张三");
        builder.setId(1);
        //设置邮箱信息
        PhoneNumber.Builder num = PhoneNumber.newBuilder();
        num.setNumber("122");
        num.setType(PhoneType.WORK);
        builder.addPhone(num);
        AddressBookProtos.Person model = builder.build();
        byte[] result = model.toByteArray();
        FileOutputStream out = new FileOutputStream(new File("E:/QQPCmgr/Desktop/person.xp"));
        out.write(result);
        out.flush();
        out.close();
          

         //反序列化到实体类     

         try{
            FileInputStream input=new FileInputStream(new File("E:/QQPCmgr/Desktop/person.xp"));
            byte[] result2=new byte[input.available()];
            input.read(result2);
            AddressBookProtos.Person msg = AddressBookProtos.Person.parseFrom(result2);
            System.out.println(msg.getEmail()+msg.getPhone(0).getNumber());
        }
        catch(Exception ex){
            System.out.println(ex.getMessage());
        }
    }
}

解释下

option java_package = "com.example.tutorial"; 
option java_outer_classname = "AddressBookProtos"; 

 

第一个包名

第二个是类名

 

本人也是菜鸟 哈哈!在这个test还学到一点ArrayList集合,不能最没有数据的情况下set这样会报 越界异常

因为ArrayList的set方法有个验证

private void RangeCheck(int index) {
    if (index >= size)
        throw new IndexOutOfBoundsException(
        "Index: "+index+", Size: "+size);
 }

你可能感兴趣的:(Google,protobuf)