Mengubah objek Java menjadi array byte sangat umum dalam skenario di mana transmisi protokol komunikasi digunakan menggunakan Netty. Misalnya, protokol memiliki beberapa header protokol yang sudah ada, classid, pesan dan informasi lainnya, dan konten utama lainnya adalah muatan. Konten protokol yang berbeda akan ditempatkan dalam muatan, dan muatan ini sering kali merupakan array byte.
Jadi, bagaimana cara membangun objek Java dengan mudah menjadi array byte?
1 bytebuf mengisi
Mari berikan contoh objek berikut:
kelas publik UGVData mengimplementasikan serialisible {private static final long serialversionuid = -219988432063763456l; // status status status byte; // saat ini GPS Longitude Float Float Longitude; // GPS Lintang Latitude Latitude Saat Ini; // Unit kecepatan mengemudi adalah M/S, dengan kecepatan float titik desimal; // persentase baterai baterai saat ini Singkat baterai; // Nomor Tugas Panjang pencarian; byte publik [] tobytearray () {bytebuf buf = unpooled.buffer (32); buf.writebyte (this.getStatus ()); buf.writeFloat (getLongitude ()); buf.writefloat (getLatitude ()); buf.writeFloat (getSpeed ()); buf.writeshort (getBatteryPentage ()); buf.writelong (getQuest ()); return buf.array (); } // hilangkan get}Maka Anda hanya perlu baru keluar dari objek di atas dan memanggil metode TobyTeArray untuk mengubah objek ini menjadi array byte.
2. Gunakan json dengan terampil
Kita semua tahu bahwa string dapat dikonversi menjadi array byte. Juga mudah untuk mengubah objek menjadi string JSON, cukup gunakan FastJson secara langsung. Jika Anda memiliki masalah menggunakan FastJson, Anda dapat melihat blog lain dari JSON.PARSEOBJECT dan contoh JSON.TOJSonstring saya
Json.tojsonstring (ugvdata) .getbytes ()
3 metode refleksi
Kerugian dari metode pertama adalah bahwa setiap kelas harus menulis metode TobyTeArray seperti ini. Jika ada terlalu banyak kelas, itu sangat merepotkan. Apakah ada cara yang nyaman? Tentu saja, ada satu, yang menggunakan refleksi (hanya akan mencerminkan pertama kali, dan cache lokal akan dilakukan nanti, sehingga overhead kinerja tidak besar). Anda perlu menambahkan lima kelas berikut di folder
1.Kodekasikan
Impor com.fasterxml.jackson.annotation.jsonignore; import com.google.common.collect.lists; import lombok.data; import java.lang.reflect.field; import java.util.collections; import java.util.comparator; impor java.util Daftar <FieldWrapper> ResolveFilelDwrapperList (class clazz) {field [] fields = clazz.getDeclaredFields (); Daftar <Tieldwrapper> fieldwrapperlist = lists.newarraylist (); untuk (bidang bidang: bidang) {codecproprety codecproprety = field.getAnnotation (codecproprety.class); if (codecproprety == null) {lanjutan; } Fieldwrapper fw = fieldwrapper baru (bidang, codecproprety); fieldwrapperlist.add (FW); } Collections.sort (fieldwrapperlist, pembanding baru <Tieldwrapper> () {@override int kompleks (fieldwrapper o1, fieldwrapper o2) {return o1.getCodecProprety ().}}); return fieldwrapperlist; } @Jsonignore Daftar abstrak publik <Fieldwrapper> getFieldWrapperList ();}2.CodeCprety
Impor java.lang.annotation.elementType; import java.lang.annotation.retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.target;@[email protected]) @target ({elementypype.field@@@{{{{{{{{{{{{{{{{{{{{{{{{elementype}) @return */ int order (); /*** Panjang data. Digunakan selama decoding, ini hanya berfungsi kecuali untuk tipe data sederhana (seperti string). * @return */ int length () default 0;}
3. Fieldwrapper
impor lombok.allargsconstructor; import lombok.data; impor java.lang.reflect.field;@data@allargsconstructorpublic kelas FieldWrapper { / *** atribut data naik dan turun* / bidang bidang pribadi; / *** anotasi atribut data naik dan turun*/ codecproprety codecprety;}4. PayloadDecoder
impor io.netty.buffer.bytebuf; impor io.netty.buffer.unpooled; impor java.lang.reflect.field; impor java.lang.reflect.method; impor Java.nio.charset.charset; impor java.util.list; Kelas Publik PayloaddoDDod. src, kelas <t> clazz) {t instance = null; coba {instance = clazz.newInstance (); } catch (Exception e) {lempar runtimeException baru ("kelas instantiasi gagal", e); } Daftar <Fieldwrapper> fieldwrapperlist = instance.getFieldWrapperList (); Bytebuf buffer = unpooled.buffer (). WriteBytes (src); untuk (fieldwrapper fieldwrapper: fieldwrapperlist) {filldata (fieldwrapper, instance, buffer); } return instance; } private static void filldata (fieldwrapper fieldwrapper, instance objek, buffer bytebuf) {field field = fieldwrapper.getfield (); field.setAccessible (true); String typename = field.getType (). GetName (); coba {switch (typename) {case "java.lang.boolean": case "boolean": boolean b = buffer.readboolean (); field.set (instance, b); merusak; Kasus "java.lang.character": case "char": charsequence charsequence = buffer.readcharcharequence (fieldwrapper.getCodecprety (). length (), charset.forname ("UTF-8")); field.set (instance, charsequence); merusak; Kasus "java.lang.byte": case "byte": byte ": byte b1 = buffer.readbyte (); field.set (instance, b1); break; case" java.lang.short ": case" pendek ": breadshort = buffer.readshort (); field.set (contoh," bread ("breads = Buffer. = Buffert.ReadInt (); java.lang.double ": case" double ": readdouble ganda = buffer.readdouble (); field.set (instance, readString);5. PayloadEncoder
impor io.netty.buffer.bytebuf; impor io.netty.buffer.unpooled; import java.lang.reflect.field; impor java.lang.reflect.method; impor publoader {tngarcable {tngarcabty> tngercable {tngarecy <leva {tngarecy <leva.util. getPayload (command t) {Daftar <Tieldwrapper> fieldwrapperlist = command.getFieldWrapperList (); Buffer bytebuf = unpooled.buffer (); fieldwrapperlist.foreach (fieldwrapper -> write2bytebuf (fieldwrapper, perintah, buffer)); return buffer.array (); } / ** * Data ditulis ke bytebuf * * @param fieldwrapper * @param instance * @param buffer * / private static void write2bytebuf (fieldwrapper fieldwrapper, contoh objek, buffer bytebuf) {field field = fieldwrapper.getfield (); String typename = field.getType (). GetName (); field.setAccessible (true); Nilai objek = null; coba {value = field.get (instance); } catch (IllegalAccessException e) {runtimeException baru ("Refleksi gagal mendapatkan nilai, diajukan:" + field.getName (), e); } switch (typename) {case "java.lang.boolean": case "boolean": buffer.writeboolean ((boolean) nilai); merusak; kasus "java.lang.character": case "char": buffer.writecharequence ((charsequence) value, charset.forname ("UTF-8")); merusak; kasus "java.lang.byte": case "byte": buffer.writebyte ((byte) nilai); merusak; kasus "java.lang.short": case "short": buffer.writeshort ((pendek) nilai); merusak; kasus "java.lang.integer": case "int": buffer.writeint ((int) value); merusak; kasus "java.lang.long": case "long": buffer.writelong ((panjang) nilai); merusak; kasus "java.lang.float": case "float": buffer.writefloat ((float) nilai); merusak; kasus "java.lang.double": case "double": buffer.writedouble ((ganda) nilai); merusak; kasus "java.lang.string": buffer.writecharequence ((Charsequence) Value, charset.forname ("UTF-8"))); merusak; Default: lempar runimeException baru (typename + "tidak didukung, bug"); }}}Setelah menambahkan lima kelas di atas, itu juga sangat mudah digunakan. Anda hanya perlu mengonversi drivestartdata menjadi array byte seperti yang ditunjukkan di bawah ini.
PayloadEncoder.getPayload (drivestArtData)
4 Ringkasan
Beberapa orang mungkin bertanya, ketiga jenis di atas jelas tipe kedua untuk mengonversi JSON adalah yang paling sederhana, jadi mengapa Anda perlu menggunakan dua lainnya?
Faktanya, tipe pertama dan ketiga dapat diklasifikasikan ke dalam kategori yang sama, keduanya mengubah objek langsung menjadi array byte. Jika lapisan berikutnya diuraikan, itu dapat diambil satu per satu;
Kasus kedua adalah mengubah string JSON objek menjadi array byte. Masalahnya adalah bahwa awal dari string JSON adalah "{", yaitu, digit pertama dari array byte yang dikonversi adalah "{" yang sesuai dengan nilai "{"
Dalam penggunaan, itu harus didasarkan pada situasi. Jika lapisan berikutnya menganalisis elemen secara langsung, gunakan yang pertama jika ada lebih sedikit objek; Gunakan yang ketiga jika ada banyak objek;
Jika lapisan berikutnya memang mengurai beberapa format JSON, gunakan yang kedua.
Semua di atas adalah seluruh konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.