Das Umwandeln von Java -Objekten in Byte -Arrays ist in Szenarien, in denen die Übertragung von Kommunikationsprotokoll verwendet wird, unter Verwendung von Netty sehr häufig. Zum Beispiel hat das Protokoll einige etablierte Protokollheader, Klassen-, MessageIDs und andere Informationen, und ein weiterer wichtiger Inhalt ist die Nutzlast. In der Nutzlast werden unterschiedliche Protokollinhalte aufgebaut, und diese Nutzlast ist häufig ein Byte -Array.
Wie konstruieren Sie also ein Java -Objekt bequem in ein Byte -Array?
1 bytebuf fill
Geben wir ein Beispiel für das folgende Objekt:
public class ugvdata implementiert serialisible {private statische endgültige lange Serialversionuid = -219988432063763456L; // Status -Code -Byte -Status; // aktuelle GPS -Längengrad -Länge; // Strom GPS Latitude Float Latitude; // Antriebsgeschwindigkeitseinheit ist M/s mit einer Dezimalpunkt -Schwimmergeschwindigkeit; // aktueller Batterieprozentsatz kurzer Akkuerzentren; // Aufgabenummer Long Quest; public byte [] tobytearray () {bytebuf buf = unpooled.buffer (32); buf.writebyte (this.getStatus ()); buf.writeFloat (getLongitude ()); buf.writeFloat (getLatitude ()); buf.writeFloat (getSpeed ()); buf.writeshort (getBatterypercentage ()); buf.writelong (getQuest ()); return buf.array (); } // weglassen Sie set}Dann müssen Sie nur das obige Objekt neu ausgeben und seine Tobytearray -Methode aufrufen, um dieses Objekt in ein Byte -Array umzuwandeln.
2. Verwenden Sie JSON geschickt
Wir alle wissen, dass Saiten in Byte -Arrays umgewandelt werden können. Es ist auch einfach, ein Objekt in eine JSON -String umzuwandeln. Verwenden Sie einfach Fastjson direkt. Wenn Sie Probleme mit Fastjson haben, können Sie sich einen anderen Blog von My JSON.ParseObject und JSON.Tojonstring -Instanz ansehen
Json.tojonstring (ugvdata) .getBytes ()
3 Reflexionsmethode
Der Nachteil der ersten Methode ist, dass jede Klasse eine Tobytearray -Methode wie diese schreiben muss. Wenn es zu viele Klassen gibt, ist es sehr problematisch. Gibt es einen bequemen Weg? Natürlich gibt es einen, der Reflexion verwendet (es wird nur das erste Mal widerspiegeln, und der lokale Cache wird später durchgeführt, sodass der Leistungsaufwand nicht groß ist). Sie müssen die folgenden fünf Klassen in einem Ordner hinzufügen
1. Beschichtbar
import com.fasterxml.jackson.annotation.jsonignore; import com.google.common.collect.lists; List <FieldWrapper> ResolveFileldWrapperList (Klasse Clazz) {field [] fields = clazz.getDeclaredfields (); Liste <FieldWrapper> fieldWrapperList = lists.NewarrayList (); für (Feldfeld: Felder) {codecproprety codecproprety = field.getAnnotation (codecproprety.class); if (codecproprety == null) {Fortsetzung; } Fieldwrapper fw = neuer fieldWrapper (field, codecproprety); fieldWrapperList.add (fw); } Collectionss.sort (fieldWrapperList, neuer Vergleicher <FieldWrapper> () {@Override public int compare (fieldwrapper o1, fieldwrapper o2) {return o1.getCodecProprety (). Order () - o2.getCodecProprety (). Order ();}}); Return FieldWrapperList; } @Jsonignore Public Abstract List <FieldWrapper> getfieldWrapperList ();}2.Codecproprety
importieren java.lang.annotation.elementtype; import Java.lang.annotation @Return */ int order (); /*** Datenlänge. Bei der Dekodierung wird nur mit Ausnahme eines einfachen Datentyps (z. B. Zeichenfolge) verwendet. * @return */ int länge () Standard 0;}
3. Fieldwrapper
import lombok.allargSconstructor; import lombok.data; import java.lang.reflect.field;@data@allargSconstructorPublic Class FieldWrapper { / *** Auf- und Abnutzungsdatenattribute* / privates Feld; / *** Anmerkungen zu Up- und Down -Datenattributen*/ private Codecproprety Codecproprety;}4. PayloadDecoder
Import IO.NETTY.Buffer.Bytebuf; Import io.netty.buffer.unpooled; Import Java.lang.Reflect.field; src, class <t> clazz) {t Instance = null; try {instance = clazz.newinstance (); } catch (Ausnahme e) {neue runTimeexception ("Instanziierungsklasse fehlgeschlagen", e); } List <FieldWrapper> fieldWrapperList = instance.getFieldWrapperList (); Bytebuf buffer = unpooled.buffer (). WriteBytes (SRC); für (fieldWrapper fieldWrapper: fieldWrapperList) {fillData (FieldWrapper, Instanz, Puffer); } return Instance; } private statische void fillData (FieldWrapper FieldWrapper, Objektinstanz, Bytebuf Buffer) {field field = fieldWrapper.getField (); field.setAccessible (true); String typeName = field.gettType (). GetName (); try {switch (typeName) {case "java.lang.boolean": case "boolean": boolean b = buffer.readboolean (); field.set (Instanz, b); brechen; Fall "java.lang.character": Fall "char": charsequence charsequence = buffer.readcharsequence (fieldwrapper.getCodecproprety (). Länge (), charset.forname ("utf-8"); field.set (Instanz, charsequence); brechen; Fall "Java.lang.Byte": Fall "Byte": Byte ": Byte B1 = Buffer.readByte (); Field.Set (Instanz, B1); Break; Fall" java.lang.short ": case" Short ": Short Readshort = Buffer.Readshort () field. readint = readint (); "Java.Lang.Double": Fall "Double": Double Readdouble = Buffer.ReadDouble (); CharSet.Forname ("UTF-8"). TOSTRING ();5. Payloadcoder
Import IO.NETTY.Buffer.Bytebuf; importieren io.netty.buffer.unpooled; Import Java.lang.Reflect.field; {List <FieldWrapper> fieldWrapperList = command.getFieldWrapperList (); Bytebuf buffer = unpooled.buffer (); FieldWrapperList.foreach (FieldWrapper -> Write2ByTebuf (FieldWrapper, Befehl, Puffer)); return buffer.array (); } / ** * Daten werden in bytebuf * * @param fieldWrapper * @param instance * @param buffer * / private static void Write2ByTebuf (fieldWrapper fieldWrapper, Objektinstanz, bytebuf buffer) {fieldweldwrapper.getfield () geschrieben. String typeName = field.gettType (). GetName (); field.setAccessible (true); Objektwert = null; try {value = field.get (Instanz); } catch (illegalAccessException e) {new RunTimeException ("Reflection hat keinen Wert erhalten, eingereicht:" + fieldname (), e); } switch (typename) {case "java.lang.boolean": case "boolean": buffer.writeBoolean ((boolean) Wert); brechen; Fall "java.lang.character": Fall "char": buffer.writecharsequence ((charsequence) Wert, charset.forname ("utf-8"); brechen; Fall "Java.lang.Byte": Fall "Byte": buffer.writebyte ((byte) Wert); brechen; Fall "java.lang.short": Fall "kurz": buffer.writeshort ((kurz) Wert; brechen; Fall "java.lang.Integer": Fall "int": buffer.writeInt ((int) Wert); brechen; Fall "java.lang.long": Fall "lang": buffer.writelong ((lang) Wert); brechen; Fall "java.lang.float": case "float": buffer.writeFloat ((float) Wert); brechen; Fall "java.lang.double": Fall "double": buffer.writedouble ((doppelter) Wert); brechen; Fall "java.lang.String": buffer.writecharsequence ((charsequence) Wert, charset.forname ("utf-8"); brechen; Standard: Wirf eine neue RunTimeException (TypName + "Nicht unterstützt, fehler"); }}}Nach dem Hinzufügen der oben genannten fünf Klassen ist es auch sehr einfach zu bedienen. Sie müssen DrivestartData nur in ein Byte -Array umwandeln, wie unten gezeigt.
PayloadCoder.getPayload (drecrivestartData)
4 Zusammenfassung
Einige Leute fragen sich vielleicht, die oben genannten drei Typen sind offensichtlich der zweite Typ, der JSON konvertiert, der einfachste. Warum müssen Sie also die anderen beiden verwenden?
Tatsächlich können der erste und dritte Typ in dieselbe Kategorie eingeteilt werden, wobei beide das Objekt direkt in ein Byte -Array konvertieren. Wenn die nächste Schicht analysiert wird, kann sie einzeln eingenommen werden;
Der zweite Fall besteht darin, die JSON -Zeichenfolge des Objekts in ein Byte -Array umzuwandeln. Das Problem ist, dass der Beginn der JSON -Zeichenfolge "{", dh die erste Ziffer des Byte -Arrays konvertiert ist, "{" entspricht dem Wert von "{"
Im Gebrauch sollte es auf der Situation basieren. Wenn die nächste Schicht die Elemente direkt analysiert, verwenden Sie den ersten, wenn weniger Objekte vorhanden sind. Verwenden Sie den dritten, wenn es viele Objekte gibt.
Wenn die nächste Schicht einige Formate von JSON analysiert, verwenden Sie die zweite.
Alle oben genannten sind der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.