Sorszámozás a java
Sorszámozás Java
Sorszámozás a folyamat a megtakarítás egy objektum állapotának a bájtok sorozata; deserialization az a folyamat helyreállítása a célja ezeknek a bájt. Java sorszámozás API-nak a szokásos mechanizmus létrehozására szerializált objektumokat. Ebben a cikkben látni fogja, hogyan sorosításához egy tárgyat, és miért sorszámozás néha szükség van. Most megtudhatod, a sorszámozás használt algoritmus Java és példa jól illusztrálja szerializált objektum formátumban. A végén meg kellett volna világos elképzelése, hogy a sorszámozás algoritmus dolgozik, valamint az út, amelynek része a tárgy képviseli a szerializált formában.
Miért sorszámozás szükség?
A mai világban, egy tipikus ipari alkalmazás lesz több összetevőből áll, és kiosztásra kerül a különféle rendszerek és hálózatok. A Java, minden képviseletében a tárgyakat; Ha két Java komponensek kell kommunikálni egymással, szükségük van egy kommunikációs mechanizmus. Számos módja van, hogy végre ezt a mechanizmust. Az első módszer az, hogy dolgozzon ki egy saját protokollt, és adja át egy objektumot. Ez azt jelenti, hogy a címzettnek meg kell tudni, hogy a protokoll által használt feladó újra létrehozni az objektumot, ami megnehezíti a fejlesztési harmadik féltől származó összetevők. Ezért kell a sokoldalú és hatékony protokoll átvitelére tárgyak összetevők között. Sorszámozás van erre a célra létrehozott, és a Java komponensek használja ezt a protokollt át tárgyakat.
Hogyan sorosításához egy tárgy?
A kezdéshez győződjön meg arról, hogy a szerializált objektum osztály megvalósítja az interfészt java.io.Serializable 1. listán.
osztály TestSerial végrehajtja Serializable nyilvános byte version = 100;
nyilvános Bájtszám = 0;
>
* Ez a forráskód is kiemelte a Source Code megjelölésében.
Az 1. listában az egyetlen dolog különbözik létre egy normál osztály végre a java.io.Serializable felületet. Serializable interfész egy marker interfész; benne nem nyilvánították egyetlen módszer. Azt mondja a sorszámozás mechanizmus, amely az osztály lehet sorba rendezni.
Most már mindent meg kell szerializálni egy tárgyat, akkor a következő lépés a tényleges objektum szerializációs. Ez úgy történik, hogy hívja writeObject (class java.io.ObjectOutputStream). amint azt a 2. lista.
public static void main (String args []) dob IOException FileOutputStream fos = new FileOutputStream ( "temp.out");
ObjectOutputStream OOS = új ObjectOutputStream (FOS);
TestSerial ts = új TestSerial ();
oos.writeObject (ts);
oos.flush ();
oos.close ();
>
* Ez a forráskód is kiemelte a Source Code megjelölésében.
2. listán láthatunk egy példányát az állami megőrzése TestSerial nevű fájlt temp.out
Ahhoz, hogy újra létrehozni az objektumot egy fájlból, akkor kell használni a kódot a 3. listában.
public static void main (String args []) dob IOException FileInputStream fis = new FileInputStream ( "temp.out");
ObjectInputStream BÁH = új ObjectInputStream (FIS);
TestSerial ts = (TestSerial) oin.readObject ();
Rendszer. out .println ( "version =" + ts.version);
>
* Ez a forráskód is kiemelte a Source Code megjelölésében.
Helyreállítása a tárgy keresztül történik a módszer hívás oin.readObject (). Az eljárás hívás szól bájt a fájlt, és létrehoz egy pontos másolata az eredeti objektum gráfot. oin.readObject () tud olvasni sorosított objektumot, ezért szükség van a kapott objektumot vezet, hogy egy adott típusú.
Befejezés kód version = 100 a szabványos kimenetre.
A formátum egy szerializált objektum
Hogy kell kinéznie egy szerializált objektum? Gondolj egy egyszerű kód az előző rész, amely TestSerial kifogást és ír temp.out. A 4. lista tartalmát mutatja temp.out. hexadecimális.
AC ED 00 05 73 72 00 0A 53 65 72 69 61 6C 54 65
73 74 A0 0C 34 00 FE B1 DD F9 02 00 02 42 00 05
63 6F 75 6E 74 42 00 07 76 65 72 73 69 6F 6E 78
70 00 64
Ha visszatekintünk TestSerial. látni fogja, hogy ő csak 2 byte tagja. Amint azt az 5. példában.
nyilvános byte version = 100;
nyilvános Bájtszám = 0;
* Ez a forráskód is kiemelte a Source Code megjelölésében.
Byte változtatható méretű egy bájt, és így teljes a tárgyak mérete (nélkül fejléc) - két bájtot. De a méret a szerializált objektum 51 bájt. Meglepett? Hol ezeket az extra bájtok és mit képvisel? Hozzátették serialization algoritmus, és újra kell létrehozni az objektumot. A következő bekezdésben ezt az algoritmust ismertetjük részletesen.
Java sorszámozás algoritmus
Ezen a ponton, akkor elég a tudás sorosításához egy tárgyat. De hogyan ez a mechanizmus működik? sorszámozás algoritmus a következőket hajtja végre:
- Vedd metaadatokat az osztály objektumhoz társított
- rekurzív bejegyzést leíró superclasses amíg el nem éri java.lang.Object
- vége után metaadatelemekre elkezdi rögzíteni a tényleges adatok társított Például csak ezúttal a felvétel indul a tetején a mikrotörzs
- rekurzív adatrekord társul egy példányát a legalacsonyabb az mikrotörzs
6. kódrészlet egy példa, amely minden lehetséges esetben a sorszámozás
osztály szülő végrehajtja Serializable int parentVersion = 10;
>
osztályú tartalmaznak végrehajtja Serializable int containVersion = 11;
>
public class SerialTest kiterjed szülő végrehajtja Serializable int változat = 66;
tartalmaznak con = új tartalmaznak ();
public int getVersion () visszatérési változata;
>
public static void main (String args []) dob IOException FileOutputStream fos = new FileOutputStream ( "temp.out");
ObjectOutputStream OOS = új ObjectOutputStream (FOS);
SerialTest st = új SerialTest ();
oos.writeObject (st);
oos.flush ();
oos.close ();
>
>
* Ez a forráskód is kiemelte a Source Code megjelölésében.
Példa SerialTest szerializálódnak objektum osztály. amely örökölt a szülő és egy tartályt tartalmaz objektum osztály tartalmaznak. 7. lista mutatja a sorosított objektumot.
AC ED 00 05 73 72 00 0A 53 65 72 69 61 6C 54 65
73 74 05 52 81 5A AC 66 02 F6 02 00 02 49 00 07
76 65 72 73 69 6F 6E 4C 00 03 63 6F 6E 74 00 09
63 4C 6F 6E 74 61 69 6E 3B 78 72 00 06 70 61 72
65 6E 74 0E DB D2 BD EE 85 63 7A 02 00 01 49 00
0D 70 61 72 65 6E 74 56 65 72 73 69 6F 6E 78 70
00 00 00 0A 00 00 00 42 73 72 00 07 63 6F 6E 74
61 69 6E FC BB E6 0E FB CB 60 C7 02 00 01 49 00
63 0E 74 61 6F 6E 69 56 65 6E 72 73 69 6F 6E 78
70 00 00 00 0B
Nézzük meg, hogy mi minősül minden bájt szerializált objektum. Az elején van egy sorszámozás protokoll információk:
- AC ED: STREAM_MAGIC. Azt mondja, hogy a használt seriazizatsii protokoll.
- 00 05: STREAM_VERSION. Verzió sorszámozás.
- 0x73: TC_OBJECT. Az elnevezés az új objektum.
Az első lépésben a sorszámozás algoritmus rögzíti a leírást az osztály objektumhoz társított. A példa már szerializált objektum SerialTest osztályban. Ezért az algoritmus elindításához felvétel SerailTest osztály leírása.
- 0x72: TC_CLASSDESC. Jelölés egy új osztályt.
- 00 0A. A hossza a nevét az osztály.
- 53 65 72 69 61 6c 54 65 73 74: SerialTest. osztály neve.
- 05 52 81 66 02 5A AC F6: SerialVersionUID. Osztály azonosító.
- 0x02. Különböző zászlók. Ez különösen a zászló azt jelzi, hogy az objektum által támogatott serialization.
- 00 02. A mezők száma az osztályban.
Most az algoritmus bejegyzések mező int version = 66; .
- 0x49. A típus kóddal. 49 «I», amely áll az Int.
- 00 07. A hossza a mező nevét.
- 76 65 72 73 69 6F 6E: változata. mező nevét.
Az algoritmus ezután írja a következő mezőbe tartalmaznak con = new tartalmaz ();. Ezért egy tárgy kanonikus JVM kijelölését ezen a területen kerülnek rögzítésre.
- 0x74: TC_STRING. Ez jelzi egy új sort.
- 00 09. A karakterlánc hosszát.
- 4C 6F 6E 63 74 61 69 6E 3B: Lcontain;. Canonical JVM aláírását.
- 0x78: TC_ENDBLOCKDATA. Választható záróblokkja adatokat az objektumot.
A következő lépés az algoritmus a szülő osztály definíciója felvételt. amely közvetlen mikrotörzs SerialTest.
- 0x72: TC_CLASSDESC. Jelölés egy új osztályt.
- 00 06. A hossza a neve az osztály.
- 70 61 72 65 6E 74: szülő. Az osztály neve
- 0E DB D2 BD 85 63 EE 7A: SerialVersionUID. Osztály azonosító.
- 0x02. Különböző zászlók. Ez a zászló azt jelzi, hogy az osztály támogatja serialization.
- 00 01. A mezők száma az osztályban.
Most, az algoritmus írja a szülő osztály leírás mezőket. osztály egy mezőt, int parentVersion = 100; .
- 0x49. A típus kóddal. 49 jelöli «I», amely lehorgonyozva Int.
- 00 0D. A hossza a mező nevét.
- 70 61 72 65 6E 74 56 65 72 73 69 6F 6E. parentVersion, a mező nevét.
- 0x78: TC_ENDBLOCKDATA. opcionális záróblokkja adatok az objektum.
- 0x70: TC_NULL. Arra utal, hogy az a tény, hogy nincs több superclasses mert elértük a felső osztály hierarchiában.
Ezt megelőzően, a sorszámozás algoritmus rögzített leírása osztályok kapcsolódó tárgy és annak minden superclasses. Most a tényleges adatok az objektumhoz társított fel kell jegyezni. Első felvett tagjai az osztály szülő:
- 00 00 00 0A: 10. Az érték parentVersion.
Aztán beköltözött SerialTest
- 00 00 00 42: 66. Az érték a változat.
A következő néhány bájt nagyon érdekes. Az algoritmus kell információt írni tartalmaznak osztály objektum.
tartalmaznak con = új tartalmaznak ();
* Ez a forráskód is kiemelte a Source Code megjelölésében.
sorszámozás algoritmus nem rögzített leírását az osztály tartalmaz. Eljött a pillanat, hogy erre.
- 0x73: TC_OBJECT. jelöli egy új objektumot.
- 0x72: TC_CLASSDESC. képviseli az új osztályban.
- 00 07. A hossza a neve az osztály.
- 63 6F 6E 74 61 69 6E: tartalmaznak. osztály neve.
- FC BB E6 0E FB CB 60 C7: SerialVersionUID. Azonosítót az osztályban.
- 0x02. Különböző zászlók. Ez a zászló azt jelzi, hogy az osztály támogatja serialization.
- 00 01. A mezők száma az osztályban.
Az algoritmus csak szöveges leírás mező osztály conatin, int containVersion = 11; .
- 0x49. A típus kóddal. 49 jelöli «I», amely lehorgonyozva Int.
- 00 0E. A hossza a mező nevét.
- 63 6F 6E 74 61 69 6E 56 65 72 73 69 6F 6E: containVersion. mező nevét.
- 0x78: TC_ENDBLOCKDATA. opcionális záróblokkja adatok az objektum.
Ezután az algoritmus ellenőrzi, hogy tartalmazza a szülő osztály van. Ha igen, az algoritmus elkezdi rögzíteni ebben az osztályban; de ebben az esetben a superclass számára nem tartalmaznak, az algoritmus bejegyzések TC_NULL.
Végül, az algoritmus rögzíti a tényleges adatok társított objektum osztály conatin.
- 00 00 00 0B: 11. fontosságát containVersion.