`
googya
  • 浏览: 143325 次
  • 性别: Icon_minigender_1
  • 来自: 汉川
社区版块
存档分类
最新评论

protocal buffer 之Java与python交互

    博客分类:
  • Java
阅读更多
        今天了解了一下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
分享到:
评论

相关推荐

    数据交换格式-protocol buffer

    它提供了强大的数据描述语言,开发者可以在.proto文件中定义数据结构,然后 Protocol Buffer 编译器会根据这些定义生成对应语言(如C++、Java、Python等)的源代码,便于在代码中使用。这些数据结构不仅可以在本地...

    jersey和Google Protocol Buffer开发Demo

    【标题】:Jersey与Google Protocol Buffer开发Demo详解 【描述】:本示例将深入探讨如何使用Jersey,一个强大的Java RESTful Web服务框架,与Google Protocol Buffers(简称PB)结合,进行高效的数据序列化。这个...

    google Protocol Buffer学习文档

    Protocol Buffers的设计目标是高效、灵活,支持多种语言,包括C++, Java, Python等。在本学习文档中,我们将深入探讨Protobuf的基本概念、使用方法以及实际应用。 **一、基本概念** 1. **数据模型**:Protobuf定义...

    Google_Protocol_Buffer_的使用和原理

    《Google Protocol Buffer的使用与原理详解》 Google Protocol Buffer(Protobuf)是一种高效、语言无关、平台无关的结构化数据序列化技术,广泛应用于数据存储、RPC(远程过程调用)系统以及持续数据存储系统。它...

    protoc-2.5.0-win32.zip和protobuf-java-2.3.0.jar

    开发者可以在Java程序中导入这个库,以便直接与Protobuf数据结构交互。 使用Protobuf的优势主要包括: 1. **效率**:Protobuf生成的序列化数据通常比XML或JSON更小,因为它们采用了二进制格式,减少了网络传输和...

    proto_db-master.zip

    ORM与Protocol Buffer的结合使得开发者能够更方便地将定义的数据结构与数据库交互,提高了开发效率和代码的可维护性。 【标签】:“proto_db”标签指明了这个项目的核心功能,即一个与Protocol Buffer相关的数据库...

    Python库 | pbtools-0.29.0-py2.py3-none-any.whl

    Python库pbtools-0.29.0-py2.py3-none-any.whl是一个用于处理Protocol Buffer(简称protobuf)的工具集,适用于Python 2和Python 3环境。protobuf是Google开发的一种数据序列化协议,它允许开发者以一种平台无关、...

    Python库 | voltha-protos-3.4.0.tar.gz

    安装完成后,开发者可以利用生成的Python模块来与Voltha平台进行交互,处理网络设备的数据和控制指令。 总的来说,voltha-protos-3.4.0是Voltha项目的重要组成部分,它提供了一套强大的接口和工具,使得开发者能够...

    针对微信小程序使用的protoBuffer库

    ProtoBuffer支持多种编程语言,包括C++、Java、Python以及JavaScript,因此在微信小程序的JavaScript环境中也能很好地运行。 **二、ProtoBuffer的优势** 1. **高效性**:ProtoBuffer的数据编码方式比JSON更紧凑,...

    protobuf-23.3最新版本

    例如,增加新的构造函数、方法或类,简化了接口,使得与protobuf交互更加方便。 3. **兼容性增强**:protobuf的一个关键特性是向后兼容,新版本通常能正确解析旧版本生成的序列化数据。在23.3版本中,谷歌可能会...

    Python库 | osmium-3.0.0-cp36-cp36m-manylinux1_x86_64.whl

    “cp36”代表Python的兼容性标识,表示它是为Python 3.6构建的,“cp36m”可能指的是Python的ABI(应用程序二进制接口),它涉及到Python模块如何与其他代码交互,“manylinux1”是一个兼容性标签,表明这个轮子文件...

    protobuf3.20.1-linux-aarch64

    2. **编译器生成代码**:使用protobuf编译器protoc,可以将.proto文件转换为不同编程语言(如C++, Java, Python等)的源代码。这些生成的代码提供了序列化和反序列化的API,方便在程序中使用。 3. **序列化与反序列...

    导入OpenStreetMap(OSM)地图数据

    OSM数据通常以XML为基础的.pbf(Binary Protocol Buffer Format)或.osm(XML Format)文件存储,包含节点、方式(线性对象)和关系等地理元素,每个元素都有自己的唯一ID和各种属性。节点代表地理位置点,方式用于...

    Python库 | pydriosm-1.0.1-py3-none-any.whl

    **Python库pydriosm-1.0.1-py3-none-...总的来说,`pydriosm`是Python开发者处理OpenStreetMap数据的一个实用工具,它简化了与OSM数据交互的过程,提升了开发效率。对于涉及地图数据处理的项目,这是一个值得考虑的库。

    linux下nanopb使用参考

    你可以在其他支持protobuf的语言(如Java、Python)中编写服务器端逻辑,然后使用nanopb在嵌入式设备上处理接收到的数据。 总的来说,nanopb在Linux环境下的使用涉及了protobuf的语法学习、nanopb工具的使用、消息...

    pybind11和numpy进行交互的方法

    Pybind11通过实现Python的buffer protocol(缓冲区协议)来支持与NumPy数组的交互。Buffer protocol允许Python对象提供其底层数据结构的访问方式,而无需复制数据。在C++中,可以使用`py::array_t`类型来接收或返回...

    phython api document

    这份文档详细介绍了如何通过 C API 与 Python 2.6 进行交互的各种方法和技术。以下是根据文档提供的目录结构对其中的重要知识点进行的总结和解析。 #### 二、关键知识点解析 ##### 2.1 引入 - **Include Files**...

    PB-PTS_Interface

    Protocol Buffers支持的语言包括C++, Java, Python等,并且有相应的代码生成工具,能自动生成处理这些数据的类和方法。这大大简化了网络服务间的通信和数据序列化/反序列化过程。 Eagle平台在项目中扮演的角色可能...

    tensorflow.dll

    这个库文件使得Java等编程语言能够与TensorFlow的C++后端进行交互,从而在Java环境中利用TensorFlow的强大功能。 在描述中提到了在Windows环境下,使用Java来读取二进制的.pb模型文件。.pb(Protocol Buffer)文件...

Global site tag (gtag.js) - Google Analytics