Protocol buffers are a flexible, efficient, automated mechanism for serializing structured data – think XML, but smaller, faster, and simpler. You define how you want your data to be structured once, then you can use special generated source code to easily write and read your structured data to and from a variety of data streams and using a variety of languages. You can even update your data structure without breaking deployed programs that are compiled against the “old” format.
packageme.ellios.tutorial;importme.ellios.tutorial.AddressBookProtos.Person;importme.ellios.tutorial.AddressBookProtos.AddressBook;importjava.io.*;importjava.util.Random;publicclassAddressBookExample{publicstaticvoidmain(String[]args)throwsException{//要通过builder来构建对象,AddressBook.BuilderaddressBuiler=AddressBook.newBuilder();Randomrandom=newRandom();for(inti=0;i<10;i++){Person.BuilderpersonBuilder=Person.newBuilder();personBuilder.setName("ellios"+i);//设置name,不能为空personBuilder.setId(i);//设置id,也不能为空personBuilder.setEmail("");//email可以为空//创建phonePerson.PhoneNumber.BuilderphoneBuilder=Person.PhoneNumber.newBuilder();phoneBuilder.setNumber("132222222222");phoneBuilder.setType(Person.PhoneType.values()[random.nextInt(3)]);//将phone添加到person中, .personBuilder.addPhone(phoneBuilder.build());//将person添加到地址簿的列表中addressBuiler.addPerson(personBuilder);}AddressBookaddressBook=addressBuiler.build();System.out.println("addressBook : "+addressBook);byte[]serializeBytes=addressBook.toByteArray();AddressBookaddressBook2=AddressBook.parseFrom(serializeBytes);System.out.println("addressBook2 equal to addressBook. result is "+addressBook.equals(addressBook2));addressBook.writeTo(newFileOutputStream("addressBook"));AddressBook.BuilderaddressBuilder3=AddressBook.newBuilder();addressBuilder3.mergeFrom(newFileInputStream("addressBook"));System.out.println("addressBook3 equal to addressBook. result is "+addressBook.equals(addressBuilder3.build()));}}
#! /usr/bin/pythonimporttutorial_pb2address_book=tutorial_pb2.AddressBook()foriinrange(10):person=address_book.person.add()person.id=iperson.name='ellios%d'%iperson.email=''phone_number=person.phone.add()phone_number.number="13233333333"ifi%3==0:phone_number.type=tutorial_pb2.Person.MOBILEelifi%3==1:phone_number.type=tutorial_pb2.Person.HOMEelifi%3==2:phone_number.type=tutorial_pb2.Person.WORKprint'address_book : ',address_bookf=open("address_book","wb")f.write(address_book.SerializeToString())f.close()address_book2=tutorial_pb2.AddressBook()f=open("address_book","rb")address_book2.ParseFromString(f.read())f.close()print"address_book same with address_book2. the result is %d"%(address_book==address_book2)
#include <iostream>#include <fstream>#include <string>#include "tutorial.pb.h"usingnamespacestd;intmain(intargc,char*argv[]){// Verify that the version of the library that we linked against is// compatible with the version of the headers we compiled against.GOOGLE_PROTOBUF_VERIFY_VERSION;tutorial::AddressBookaddress_book;for(inti=0;i<10;i++){tutorial::Person*person=address_book.add_person();person->set_id(i);person->set_name("ellios");person->set_email("");tutorial::Person::PhoneNumber*phone_number=person->add_phone();phone_number->set_number("13333333333");phone_number->set_type(tutorial::Person::HOME);}// Write the new address book back to disk.fstreamoutput("address_book",ios::out|ios::trunc|ios::binary);if(!address_book.SerializeToOstream(&output)){cerr<<"Failed to write address book."<<endl;return-1;}cout<<"address_book : "<<address_book.person_size()<<endl;tutorial::AddressBookaddress_book2;fstreaminput("address_book",ios::in|ios::binary);address_book2.ParseFromIstream(&input);// Optional: Delete all global objects allocated by libprotobuf.google::protobuf::ShutdownProtobufLibrary();return0;}