Protobuf讲解

Hadoop广泛用到Protobuf,而且Protobuf的效率极高,网络间传输数据量小。

首先需要新建一个描述对象,在这里我们明明命名为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;
			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;
		}

然后对它执行protobuf的编译命令

./protoc --java_out=. addressbook.proto

然后将生成的java文件导入到IED中,就可以编程了。

也新建了一个java自带的序列化

package com.example.tutorial;

import java.io.Serializable;

public class JavaSerializableBean implements Serializable {
    private String name;
    private String PhoneNo;
    private int id;
    private String email;

    public JavaSerializableBean(){

    }

    public JavaSerializableBean(String name, String phoneNo, int id, String email) {
        this.name = name;
        PhoneNo = phoneNo;
        this.id = id;
        this.email = email;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPhoneNo() {
        return PhoneNo;
    }

    public void setPhoneNo(String phoneNo) {
        PhoneNo = phoneNo;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

import com.example.tutorial.AddressBookProtos;
import com.example.tutorial.JavaSerializableBean;
import org.junit.Test;

import java.io.*;

public class ProtobufTest {
    /**
     * 将protobuf序列化后的文件写入磁盘
     * @throws Exception
     */
    @Test
    public void write() throws Exception {

        AddressBookProtos.Person tom=AddressBookProtos.Person.newBuilder()
                .setId(12345)
                .setName("tom")
                .setEmail("123@123.123")
                .addPhone(AddressBookProtos.Person.PhoneNumber.newBuilder()
                            .setNumber("+351 999 999 999")
                            .setType(AddressBookProtos.Person.PhoneType.HOME)
                            .build())
                .build();
        tom.writeTo(new FileOutputStream("/Users/simmucheng/tmp/protobuf_test/persion.data"));
    }

    /**
     * 将写入磁盘的序列化文件反序列化读取出来
     * @throws Exception
     */
    @Test
    public void read() throws Exception {

        AddressBookProtos.Person tom=AddressBookProtos.Person.parseFrom(
                new FileInputStream("/Users/simmucheng/tmp/protobuf_test/persion.data"));
        System.out.println(tom.getName());
    }
    @Test
    public void SerializableWrite() throws Exception {
        JavaSerializableBean bean=new JavaSerializableBean();
        bean.setEmail("123@123.123");
        bean.setName("tom");
        bean.setId(12345);
        bean.setPhoneNo("+351 999 999 999");
        ObjectOutputStream obj=new ObjectOutputStream(
                new FileOutputStream("/Users/simmucheng/tmp/protobuf_test/bean.data"));
        obj.writeObject(bean);
        obj.close();
    }
    @Test
    public void SerializableRead() throws Exception {
        ObjectInputStream obj=new ObjectInputStream(
                new FileInputStream("/Users/simmucheng/tmp/protobuf_test/bean.data"));
        JavaSerializableBean bean= (JavaSerializableBean) obj.readObject();
        System.out.println(bean.getName());
    }

}

下面放一个Protobuf的上手文档

Protobuf

https://github.com/xiammu/BookNote/blob/master/Google%20Protocol%20Buffers.pdf

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值