请选择 进入手机版 | 继续访问电脑版
搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

Netty学习——Google Protobuf的初步了解

[复制链接]
查看: 82|回复: 0

8157

主题

8157

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
24481
发表于 2019-12-2 22:25 | 显示全部楼层 |阅读模式
学细考的官网: https://developers.google.com/protocol-buffers/docs/javatutorial   
简单指南详解:这个文档写的简直是太具体了。
本篇从下面三个步伐举行先容:
具体内容,我就不做过量诠释,自行查阅官方文档,在这只是记载,我以为比力严重的工具,可以也许帮助我更好的大白。

I.Define message formats in a .proto file.   
  1. syntax = "proto2";package tutorial; //包名option java_package = "com.example.tutorial";  //针对于java的包名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];  // optional典范 和界说默许值  }  repeated PhoneNumber phones = 4;}message AddressBook {  repeated Person people = 1;  //repeated典范,实在就相当于java的ArrayList,用来}
复制代码
其他必要留意的点:
1.对于前两个字段java_package  和 package ,就是说,可以不写java_package,会默许 挪用package ,写了java_package,java就会识别这个,可是就算写了java_package,也要package ,是为了其他说话可以也许有包名可以也许利用
我的关键词 Netty进修——Google Protobuf的初步领会  热门消息 1464573-20191202180433812-1806105933

2.这个数字,=1, =2 ,不是次第,大如果赋值,只是每一个字段在Proto文件中,城市有一个唯一数字标识符
我的关键词 Netty进修——Google Protobuf的初步领会  热门消息 1464573-20191202180445097-74229540

3.对于以下的三种典范 required,optional,repeated  官方举荐,尽管不是用required,由于弊大于利。
我的关键词 Netty进修——Google Protobuf的初步领会  热门消息 1464573-20191202180455779-1153544048


II. Use the protocol buffer compiler.
必要留意的地方:
利用PB编译器天生出的工具是不成变的,必要利用构建器的方式连形式(set.set.set )一个一个的去设备值,然后再必要末端利用build方式去完成全部工具的建立,以下先容
每一次set完以后的返回结果,都是另一个构建器,就是为了可以也许在一行代码上,完成工具的构建
我的关键词 Netty进修——Google Protobuf的初步领会  热门消息 1464573-20191202180554524-51981429

经过构建器的方式连形式,完成一个工具的建立和设备值的标准写法:以下
  1. Person john =  Person.newBuilder()    .setId(1234)    .setName("John Doe")    .setEmail("jdoe@example.com")    .addPhones(      Person.PhoneNumber.newBuilder()        .setNumber("555-4321")        .setType(Person.PhoneType.HOME))    .build();
复制代码
Message除了自界说的属性之外,还供给的有几个默许的方式,让你可以也许检查和操纵全部消息
  1. isInitialized()://检查能否全数的必备字段,都已经被设备值toString(): //返回一小我类可读的字符形式,凡是用于调试mergeFrom()://(只要构建器才有)将另一个消息的内容,合并到当前消息傍边而且覆盖之前的标量字段,合并复核的字段和反复的阻断,完成工具的合并clear()://(只要构建器才有) 规复到本来属性都为空的这个状态
复制代码
我的关键词 Netty进修——Google Protobuf的初步领会  热门消息 1464573-20191202180706705-1310505190

分解和序列化这些消息
  1. byte[] toByteArray(); //将消息序列化,并返回了包含原生字节的一个字节数组,就是把消息自己转换成字节数组static Person parseFrom(byte[] data);//从给定的字节数组傍边分解这条消息,将字节数组的内容转换成工具void writeTo(OutputStream output);//将消息序列化,并输出到一个输出流傍边,static Person parseFrom(InputStream input); //接着读取输入流中的消息并举行分解
复制代码
留意:不能经过继续的方式,给这个工具增加更多的行为。
假如想要给这个message工具赋予响应的方式,可以借助利用多个message合并的方式来实现功用而并不是经过继续的方式
我的关键词 Netty进修——Google Protobuf的初步领会  热门消息 1464573-20191202180739340-1655386434


III. Use the Java protocol buffer API to write and read messages.
Writer a Message
  1. 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.addPhones(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();  }}
复制代码
Reader a Message
  1. import com.example.tutorial.AddressBookProtos.AddressBook;import com.example.tutorial.AddressBookProtos.Person;import java.io.FileInputStream;import java.io.IOException;import java.io.PrintStream;class ListPeople {  // Iterates though all people in the AddressBook and prints info about them.  static void Print(AddressBook addressBook) {    for (Person person: addressBook.getPeopleList()) {      System.out.println("Person ID: " + person.getId());      System.out.println("  Name: " + person.getName());      if (person.hasEmail()) {        System.out.println("  E-mail address: " + person.getEmail());      }      for (Person.PhoneNumber phoneNumber : person.getPhonesList()) {        switch (phoneNumber.getType()) {          case MOBILE:            System.out.print("  Mobile phone #: ");            break;          case HOME:            System.out.print("  Home phone #: ");            break;          case WORK:            System.out.print("  Work phone #: ");            break;        }        System.out.println(phoneNumber.getNumber());      }    }  }  // Main function:  Reads the entire address book from a file and prints all  //   the information inside.  public static void main(String[] args) throws Exception {    if (args.length != 1) {      System.err.println("Usage:  ListPeople ADDRESS_BOOK_FILE");      System.exit(-1);    }    // Read the existing address book.    AddressBook addressBook =      AddressBook.parseFrom(new FileInputStream(args[0]));    Print(addressBook);  }}
复制代码
免责声明:假如加害了您的权益,请联系站长,我们会实时删除侵权内容,感谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2006-2014 淄博新闻网-淄博日报 淄博晚报 淄博财经新报 掌中淄博 淄博专业新闻资讯发布网站 版权所有 法律顾问:高律师 客服电话:0791-88289918
技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表