- Get link
- X
- Other Apps
Featured Post
Posted by
Unknown
on
- Get link
- X
- Other Apps
Protocol buffers (that's what protobuf means :)) are a means to serialize structured data. Now you may be wondering what this 'serialize' means.
To be brief : Serialization is a process of packing the data structures or objects into sequence of bits so that they can be stored in a file or a buffer and transmitted across the network and then can be retrieved on the same or other system environment. Examples include XML, JSON, ASN.1, YAML, ProtoBuf etc.
Advantages :
1. Persistent object creation
2. RPC enabling
3. Are simple
4. Save space on disk
5. Very fast
6. Platform and language independent
ProtoBuf is available freely from Google (http://code.google.com/p/protobuf/). Procedure of installation and compilation is present there.
Everything that needs to be serialized is put in a protocol buffer message (a .proto file). This file tells the compiler how the data is to be serialized.
For each field there are setter and getter functions fieldname() is a getter and set_fieldname() is a setter. Remember to use these functions as the exact way it is told here.
The tutorials for the different languages can be found here
I present a small simple example to use the protobuf library and there is much more than that one can do with the protobuf :)
To make and run the example (on linux) follow the steps :
1. Download the tar.gz package from here
2. Login as root
3. Untar it in your home directory (say user1)
4. Go inside the protobuf directory and run ./configure
5. Add the path /usr/local/lib to the environment variable LD_LIBRARY_PATH
6. Then run :
make
make install
7. You are now ready to use the library.
8. To use protobuf you will need following files (I am explaining for c++ only):
.cc file
.proto file
Makefile
Rest of the files are generated on the fly.
Here is an example of a Vehicle parts which contains three fields , two mandatory and one optional.
-Part ID (mandatory)
-Part Name (mandatory)
-Vendor (optional)
We write this in .proto file
Then we write a c++ program to use the library and .proto to add serialized data to the data file.
Then we write a c++ program to use the library and .proto to serialize the data.
Save all these files under <proto-installation-path>/examples/ and run make
To run the example
./add_part_cpp <data-filename>
./list_parts_cpp <data-filename>
To be brief : Serialization is a process of packing the data structures or objects into sequence of bits so that they can be stored in a file or a buffer and transmitted across the network and then can be retrieved on the same or other system environment. Examples include XML, JSON, ASN.1, YAML, ProtoBuf etc.
Advantages :
1. Persistent object creation
2. RPC enabling
3. Are simple
4. Save space on disk
5. Very fast
6. Platform and language independent
ProtoBuf is available freely from Google (http://code.google.com/p/protobuf/). Procedure of installation and compilation is present there.
Everything that needs to be serialized is put in a protocol buffer message (a .proto file). This file tells the compiler how the data is to be serialized.
For each field there are setter and getter functions fieldname() is a getter and set_fieldname() is a setter. Remember to use these functions as the exact way it is told here.
The tutorials for the different languages can be found here
I present a small simple example to use the protobuf library and there is much more than that one can do with the protobuf :)
To make and run the example (on linux) follow the steps :
1. Download the tar.gz package from here
2. Login as root
3. Untar it in your home directory (say user1)
4. Go inside the protobuf directory and run ./configure
5. Add the path /usr/local/lib to the environment variable LD_LIBRARY_PATH
6. Then run :
make
make install
7. You are now ready to use the library.
8. To use protobuf you will need following files (I am explaining for c++ only):
.cc file
.proto file
Makefile
Rest of the files are generated on the fly.
Here is an example of a Vehicle parts which contains three fields , two mandatory and one optional.
-Part ID (mandatory)
-Part Name (mandatory)
-Vendor (optional)
We write this in .proto file
//partbook.proto package tutorial; message Part { required string name = 1; required int32 partid = 2; // Unique ID number for this part optional string vendor = 3; } message PartDetails { repeated Part part = 1; }
Then we write a c++ program to use the library and .proto to add serialized data to the data file.
/*add_part.cc*/ #include <iostream> #include <fstream> #include <string> #include "partbook.pb.h" using namespace std; /* This function fills in a Part message based on user input.*/ void PromptForPart(tutorial::Part* part) { cout << "Enter part ID number: "; int partid; cin >> partid; part->set_partid(partid); cin.ignore(256, '\n'); cout << "Enter part name: "; getline(cin, *part->mutable_name()); cout << "Enter vendor name (blank for none): "; string vendor; getline(cin, vendor); if (!vendor.empty()) { part->set_vendor(vendor); } } /* Main function: Reads the entire part list from a file, * adds one part based on user input, then writes it back out to the same * file. */ int main(int argc, 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; if (argc != 2) { cerr << "Usage: " << argv[0] << " PART_BOOK_FILE" << endl; return -1; } tutorial::PartDetails part_book; { // Read the existing part book. fstream input(argv[1], ios::in | ios::binary); if (!input) { cout << argv[1] << ": File not found. Creating a new file." << endl; } else if (!part_book.ParseFromIstream(&input)) { cerr << "Failed to parse part book." << endl; return -1; } } // Add a new part. PromptForPart(part_book.add_part()); { // Write the new part book back to disk. fstream output(argv[1], ios::out | ios::trunc | ios::binary); if (!part_book.SerializeToOstream(&output)) { cerr << "Failed to write part book." << endl; return -1; } } // Optional: Delete all global objects allocated by libprotobuf. google::protobuf::ShutdownProtobufLibrary(); return 0; }
Then we write a c++ program to use the library and .proto to serialize the data.
/*list_parts.cc*/ #include <iostream> #include <fstream> #include <string> #include "partbook.pb.h" using namespace std; // Iterates though all parts in the PartDetails and prints info about them. void ListParts(const tutorial::PartDetails& part_book) { for (int i = 0; i < part_book.part_size(); i++) { const tutorial::Part& part = part_book.part(i); cout << "Part ID: " << part.partid() << endl; cout << " Name: " << part.name() << endl; if (part.has_vendor()) { cout << " Vendor: " << part.vendor() << endl; } } } // Main function: Reads the entire part book from a file and prints all // the information inside. int main(int argc, 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; if (argc != 2) { cerr << "Usage: " << argv[0] << " PART_BOOK_FILE" << endl; return -1; } tutorial::PartDetails part_book; { // Read the existing data file. fstream input(argv[1], ios::in | ios::binary); if (!part_book.ParseFromIstream(&input)) { cerr << "Failed to parse part book." << endl; return -1; } } ListParts(part_book); // Optional: Delete all global objects allocated by libprotobuf. google::protobuf::ShutdownProtobufLibrary(); return 0; }
#Makefile #This creates executables for python cpp and java , to create only one language use #'make cpp' or 'make python' or 'make java' .PHONY: all cpp java python clean all: cpp java python cpp: add_part_cpp list_parts_cpp java: add_part_java list_parts_java python: add_part_python list_parts_python clean: rm -f add_part_cpp list_parts_cpp add_part_java list_parts_java add_part_python list_parts_python rm -f javac_middleman AddPart*.class ListParts*.class com/example/tutorial/*.class rm -f protoc_middleman partbook.pb.cc partbook.pb.h partbook.pb2.py com/example/tutorial/PartBookProtos.java rm -f *.pyc rmdir com/example/tutorial 2>/dev/null || true rmdir com/example 2>/dev/null || true rmdir com 2>/dev/null || true protoc_middleman: partbook.proto protoc --cpp_out=. --java_out=. --python_out=. partbook.proto @touch protoc_middleman add_part_cpp: add_part.cc protoc_middleman pkg-config --cflags protobuf # fails if protobuf is not installed c++ add_part.cc partbook.pb.cc -o add_part_cpp `pkg-config --cflags --libs protobuf` list_parts_cpp: list_parts.cc protoc_middleman pkg-config --cflags protobuf # fails if protobuf is not installed c++ list_parts.cc partbook.pb.cc -o list_parts_cpp `pkg-config --cflags --libs protobuf` javac_middleman: AddPart.java ListParts.java protoc_middleman javac AddPart.java ListParts.java com/example/tutorial/PartBookProtos.java @touch javac_middleman add_part_java: javac_middleman @echo "Writing shortcut script add_part_java..." @echo '#! /bin/sh' > add_part_java @echo 'java -classpath .:$$CLASSPATH AddPart "$$@"' >> add_part_java @chmod +x add_part_java list_parts_java: javac_middleman @echo "Writing shortcut script list_parts_java..." @echo '#! /bin/sh' > list_parts_java @echo 'java -classpath .:$$CLASSPATH ListParts "$$@"' >> list_parts_java @chmod +x list_parts_java add_part_python: add_part.py protoc_middleman @echo "Writing shortcut script add_part_python..." @echo '#! /bin/sh' > add_part_python @echo './add_part.py "$$@"' >> add_part_python @chmod +x add_part_python list_parts_python: list_parts.py protoc_middleman @echo "Writing shortcut script list_parts_python..." @echo '#! /bin/sh' > list_parts_python @echo './list_parts.py "$$@"' >> list_parts_python @chmod +x list_parts_python
Save all these files under <proto-installation-path>/examples/ and run make
To run the example
./add_part_cpp <data-filename>
./list_parts_cpp <data-filename>
Comments
Actually iam new to Protobuff,so can you please explain about in Java step by step.
ReplyDeleteBest way to learn it from the source itself https://developers.google.com/protocol-buffers/docs/javatutorial
Delete