今天了解了一下protocal buffer,觉得这个协议还是比较有实用价值的。不同语言(当前只支持java,python和c++)可以对相同的模型进行操作,而且通过特殊的编码使得交互的数据量变得很小。当然,目前对这个协议了解得比较有限,还说不出什么一二三。下面是安装使用protocal buffer的过程。
以下的操作都是在cygwin环境下面。
首先当然是安装。
参照readme文件:
$ ./configure
$ make
$ make check
$ make install
安装之后,进行检查,输入
protoc --version
我这里的结果是:
libprotoc 2.4.0
出现了版本号之后,就说明安装是正常的。
java 接着是,生成jar包:
mvn install
安装 python包:
$ python setup.py install
全部完成之后,采用protocal buffer的例子(此处略去1000字)
分别输出成java文件和py文件
$ protoc -I=. --java_out=. ./addressbook.proto
$ protoc -I=. --python_out=. ./addressbook.proto
用Java添加信息到文件中:
import com.example.tutorial.AddressBookProtos.AddressBook;
import com.example.tutorial.AddressBookProtos.Person;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.PrintStream;
class AddPerson {
// This function fills in a Person message based on user input.
static Person PromptForAddress(BufferedReader stdin,
PrintStream stdout) throws IOException {
Person.Builder person = Person.newBuilder();
stdout.print("Enter person ID: ");
person.setId(Integer.valueOf(stdin.readLine()));
stdout.print("Enter name: ");
person.setName(stdin.readLine());
stdout.print("Enter email address (blank for none): ");
String email = stdin.readLine();
if (email.length() > 0) {
person.setEmail(email);
}
while (true) {
stdout.print("Enter a phone number (or leave blank to finish): ");
String number = stdin.readLine();
if (number.length() == 0) {
break;
}
Person.PhoneNumber.Builder phoneNumber =
Person.PhoneNumber.newBuilder().setNumber(number);
stdout.print("Is this a mobile, home, or work phone? ");
String type = stdin.readLine();
if (type.equals("mobile")) {
phoneNumber.setType(Person.PhoneType.MOBILE);
} else if (type.equals("home")) {
phoneNumber.setType(Person.PhoneType.HOME);
} else if (type.equals("work")) {
phoneNumber.setType(Person.PhoneType.WORK);
} else {
stdout.println("Unknown phone type. Using default.");
}
person.addPhone(phoneNumber);
}
return person.build();
}
// Main function: Reads the entire address book from a file,
// adds one person based on user input, then writes it back out to the same
// file.
public static void main(String[] args) throws Exception {
if (args.length != 1) {
System.err.println("Usage: AddPerson ADDRESS_BOOK_FILE");
System.exit(-1);
}
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(
PromptForAddress(new BufferedReader(new InputStreamReader(System.in)),
System.out));
// Write the new address book back to disk.
FileOutputStream output = new FileOutputStream(args[0]);
addressBook.build().writeTo(output);
output.close();
}
}
编译执行。。。。。。
之后用python读取
import addressbook_pb2
import sys
# Iterates though all people in the AddressBook and prints info about them.
def ListPeople(address_book):
for person in address_book.person:
print "Person ID:", person.id
print " Name:", person.name
if person.HasField('email'):
print " E-mail address:", person.email
for phone_number in person.phone:
if phone_number.type == addressbook_pb2.Person.MOBILE:
print " Mobile phone #: ",
elif phone_number.type == addressbook_pb2.Person.HOME:
print " Home phone #: ",
elif phone_number.type == addressbook_pb2.Person.WORK:
print " Work phone #: ",
print phone_number.number
# Main procedure: Reads the entire address book from a file and prints all
# the information inside.
if len(sys.argv) != 2:
print "Usage:", sys.argv[0], "ADDRESS_BOOK_FILE"
sys.exit(-1)
address_book = addressbook_pb2.AddressBook()
# Read the existing address book.
f = open(sys.argv[1], "rb")
address_book.ParseFromString(f.read())
f.close()
ListPeople(address_book)
最后的结果如图:
添加
读取
- 大小: 31.2 KB
- 大小: 38.4 KB
分享到:
相关推荐
它提供了强大的数据描述语言,开发者可以在.proto文件中定义数据结构,然后 Protocol Buffer 编译器会根据这些定义生成对应语言(如C++、Java、Python等)的源代码,便于在代码中使用。这些数据结构不仅可以在本地...
【标题】:Jersey与Google Protocol Buffer开发Demo详解 【描述】:本示例将深入探讨如何使用Jersey,一个强大的Java RESTful Web服务框架,与Google Protocol Buffers(简称PB)结合,进行高效的数据序列化。这个...
Protocol Buffers的设计目标是高效、灵活,支持多种语言,包括C++, Java, Python等。在本学习文档中,我们将深入探讨Protobuf的基本概念、使用方法以及实际应用。 **一、基本概念** 1. **数据模型**:Protobuf定义...
《Google Protocol Buffer的使用与原理详解》 Google Protocol Buffer(Protobuf)是一种高效、语言无关、平台无关的结构化数据序列化技术,广泛应用于数据存储、RPC(远程过程调用)系统以及持续数据存储系统。它...
开发者可以在Java程序中导入这个库,以便直接与Protobuf数据结构交互。 使用Protobuf的优势主要包括: 1. **效率**:Protobuf生成的序列化数据通常比XML或JSON更小,因为它们采用了二进制格式,减少了网络传输和...
ORM与Protocol Buffer的结合使得开发者能够更方便地将定义的数据结构与数据库交互,提高了开发效率和代码的可维护性。 【标签】:“proto_db”标签指明了这个项目的核心功能,即一个与Protocol Buffer相关的数据库...
Python库pbtools-0.29.0-py2.py3-none-any.whl是一个用于处理Protocol Buffer(简称protobuf)的工具集,适用于Python 2和Python 3环境。protobuf是Google开发的一种数据序列化协议,它允许开发者以一种平台无关、...
安装完成后,开发者可以利用生成的Python模块来与Voltha平台进行交互,处理网络设备的数据和控制指令。 总的来说,voltha-protos-3.4.0是Voltha项目的重要组成部分,它提供了一套强大的接口和工具,使得开发者能够...
ProtoBuffer支持多种编程语言,包括C++、Java、Python以及JavaScript,因此在微信小程序的JavaScript环境中也能很好地运行。 **二、ProtoBuffer的优势** 1. **高效性**:ProtoBuffer的数据编码方式比JSON更紧凑,...
“cp36”代表Python的兼容性标识,表示它是为Python 3.6构建的,“cp36m”可能指的是Python的ABI(应用程序二进制接口),它涉及到Python模块如何与其他代码交互,“manylinux1”是一个兼容性标签,表明这个轮子文件...
例如,增加新的构造函数、方法或类,简化了接口,使得与protobuf交互更加方便。 3. **兼容性增强**:protobuf的一个关键特性是向后兼容,新版本通常能正确解析旧版本生成的序列化数据。在23.3版本中,谷歌可能会...
2. **编译器生成代码**:使用protobuf编译器protoc,可以将.proto文件转换为不同编程语言(如C++, Java, Python等)的源代码。这些生成的代码提供了序列化和反序列化的API,方便在程序中使用。 3. **序列化与反序列...
OSM数据通常以XML为基础的.pbf(Binary Protocol Buffer Format)或.osm(XML Format)文件存储,包含节点、方式(线性对象)和关系等地理元素,每个元素都有自己的唯一ID和各种属性。节点代表地理位置点,方式用于...
**Python库pydriosm-1.0.1-py3-none-...总的来说,`pydriosm`是Python开发者处理OpenStreetMap数据的一个实用工具,它简化了与OSM数据交互的过程,提升了开发效率。对于涉及地图数据处理的项目,这是一个值得考虑的库。
你可以在其他支持protobuf的语言(如Java、Python)中编写服务器端逻辑,然后使用nanopb在嵌入式设备上处理接收到的数据。 总的来说,nanopb在Linux环境下的使用涉及了protobuf的语法学习、nanopb工具的使用、消息...
Pybind11通过实现Python的buffer protocol(缓冲区协议)来支持与NumPy数组的交互。Buffer protocol允许Python对象提供其底层数据结构的访问方式,而无需复制数据。在C++中,可以使用`py::array_t`类型来接收或返回...
这份文档详细介绍了如何通过 C API 与 Python 2.6 进行交互的各种方法和技术。以下是根据文档提供的目录结构对其中的重要知识点进行的总结和解析。 #### 二、关键知识点解析 ##### 2.1 引入 - **Include Files**...
Protocol Buffers支持的语言包括C++, Java, Python等,并且有相应的代码生成工具,能自动生成处理这些数据的类和方法。这大大简化了网络服务间的通信和数据序列化/反序列化过程。 Eagle平台在项目中扮演的角色可能...
这个库文件使得Java等编程语言能够与TensorFlow的C++后端进行交互,从而在Java环境中利用TensorFlow的强大功能。 在描述中提到了在Windows环境下,使用Java来读取二进制的.pb模型文件。.pb(Protocol Buffer)文件...