Netty with protobuf(一)
2019獨角獸企業重金招聘Python工程師標準>>>
Netty with protobuf
這是一篇關于netty和protobuf2的文章,先來介紹一下protobuf的簡單使用。網上有很多基本的protobuf的介紹,這里就不在贅述了。
protobuf官網上提供了一個例子,我們就拿那個例子來改造:
proto文件描述了消息的結構,這個文件時這樣的
package?tutorial;option?java_package?=?"com.example.tutorial"; 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];}repeated?PhoneNumber?phone?=?4; }message?AddressBook?{repeated?Person?person?=?1; }我們現在通過protobuf提供的源代碼編譯器生成我們的Java代碼
E:\tools2\protobuf>protoc.exe?-I=E:\test-protobuf?--java_out=E:\test-protobuf?E:\test-protobuf\addressbook.proto-I表示指定proto文件的目錄位置,--java-out表示輸出Java源代碼的目錄位置,后跟的參數表示文件的路徑
現在在你所指定的目錄下有一個Java類文件,就是AddressBookProtos.java文件。
通過這個類可以把這個類序列化,看示例代碼:
@Test public?void?test()?throws?IOException?{AddressBookProtos.AddressBook.Builder?addressBookBuilder?=?AddressBookProtos.AddressBook.newBuilder();AddressBookProtos.Person.PhoneNumber.Builder?phoneNumberBuilder?=?AddressBookProtos.Person.PhoneNumber.newBuilder();AddressBookProtos.Person.Builder?personBuilder?=?AddressBookProtos.Person.newBuilder();personBuilder.setEmail("744858873@qq.com").setId(123456789).setName("hellolyx");personBuilder.addPhone(phoneNumberBuilder.setNumber("15840330465").setType(AddressBookProtos.Person.PhoneType.HOME).build());personBuilder.addPhone(phoneNumberBuilder.setNumber("15840330466").setType(AddressBookProtos.Person.PhoneType.WORK).build());personBuilder.addPhone(phoneNumberBuilder.setNumber("15840330467").setType(AddressBookProtos.Person.PhoneType.MOBILE).build());personBuilder.addPhone(phoneNumberBuilder.setNumber("15840330468").setType(AddressBookProtos.Person.PhoneType.MOBILE).build());personBuilder.addPhone(phoneNumberBuilder.setNumber("15840330469").setType(AddressBookProtos.Person.PhoneType.MOBILE).build());personBuilder.setPhone(0,?phoneNumberBuilder.setNumber("110").setType(AddressBookProtos.Person.PhoneType.MOBILE).build());//向電話薄里添加一個聯系人addressBookBuilder.addPerson(personBuilder.build());personBuilder.setEmail("78655676@qq.com").setId(123456789).setName("hellodog");personBuilder.addPhone(phoneNumberBuilder.setNumber("15840330465").setType(AddressBookProtos.Person.PhoneType.HOME).build());personBuilder.addPhone(phoneNumberBuilder.setNumber("15840330466").setType(AddressBookProtos.Person.PhoneType.WORK).build());personBuilder.addPhone(phoneNumberBuilder.setNumber("15840330467").setType(AddressBookProtos.Person.PhoneType.MOBILE).build());personBuilder.addPhone(phoneNumberBuilder.setNumber("15840330468").setType(AddressBookProtos.Person.PhoneType.MOBILE).build());personBuilder.addPhone(phoneNumberBuilder.setNumber("15840330469").setType(AddressBookProtos.Person.PhoneType.MOBILE).build());personBuilder.setPhone(0,?phoneNumberBuilder.setNumber("119").setType(AddressBookProtos.Person.PhoneType.MOBILE).build());//再次向電話薄里添加一個聯系人addressBookBuilder.addPerson(personBuilder.build());personBuilder.setEmail("78655676@qq.com").setId(123456789).setName("hellopig");personBuilder.addPhone(phoneNumberBuilder.setNumber("15840330465").setType(AddressBookProtos.Person.PhoneType.HOME).build());personBuilder.addPhone(phoneNumberBuilder.setNumber("15840330466").setType(AddressBookProtos.Person.PhoneType.WORK).build());personBuilder.addPhone(phoneNumberBuilder.setNumber("15840330467").setType(AddressBookProtos.Person.PhoneType.MOBILE).build());personBuilder.addPhone(phoneNumberBuilder.setNumber("15840330468").setType(AddressBookProtos.Person.PhoneType.MOBILE).build());personBuilder.addPhone(phoneNumberBuilder.setNumber("15840330469").setType(AddressBookProtos.Person.PhoneType.MOBILE).build());personBuilder.setPhone(0,?phoneNumberBuilder.setNumber("124").setType(AddressBookProtos.Person.PhoneType.MOBILE).build());addressBookBuilder.addPerson(personBuilder.build());/***?一個電話薄里添加了三個人*/byte[]?book?=?addressBookBuilder.build().toByteArray();String?path?=?"E:\\test-protobuf\\test.txt";FileOutputStream?fileOutputStream?=?new?FileOutputStream(path);fileOutputStream.write(book);fileOutputStream.close();//反序列化AddressBookProtos.AddressBook?b?=?AddressBookProtos.AddressBook.parseFrom(book);System.out.println(b.toString()); }這是通過proto.exe生成的Java類的基本用法,最后打印出來的信息略。
通過這種方式,你可以發現序列化一個類是不是很方便啊,并且序列化和反序列有很好的性能,同時序列后的數據量很小。
在上個例子中,我們吧序列化后的數據保存在了txt文件中,現在可以通過讀取這個文本文件反序列化。
這就是基本的protobuf-java類庫的基本使用方法。對于protobuf的自描述消息還沒有研究的很透徹,等研究明白了,再把那個發上來。
====END====
轉載于:https://my.oschina.net/xinxingegeya/blog/295031
總結
以上是生活随笔為你收集整理的Netty with protobuf(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#_自动化测试 (四) 自动卸载软件
- 下一篇: 你知道为什么Xcode6中Swift没有