日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Netty with protobuf(一)

發布時間:2023/12/20 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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文件中,現在可以通過讀取這個文本文件反序列化。

/***?在運行時確定消息格式,動態生成消息*/ @Test public?void?test8876()?throws?IOException?{String?messagePath?=?"E:\\test-protobuf\\test.txt";FileInputStream?fileInputStream?=?new?FileInputStream(messagePath);byte[]?message?=?new?byte[fileInputStream.available()];fileInputStream.read(message);Descriptors.FileDescriptor?fileDescriptor?=?AddressBookProtos.getDescriptor();Descriptors.Descriptor?addressBookDescriptor?=?fileDescriptor.findMessageTypeByName("AddressBook");DynamicMessage?addressBook?=?DynamicMessage.parseFrom(addressBookDescriptor,?message);System.out.println(addressBook.toString()); }

這就是基本的protobuf-java類庫的基本使用方法。對于protobuf的自描述消息還沒有研究的很透徹,等研究明白了,再把那個發上來。

====END====

轉載于:https://my.oschina.net/xinxingegeya/blog/295031

總結

以上是生活随笔為你收集整理的Netty with protobuf(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。