Mikä on Java-sarjallisuuden käsite?



Tämä artikkeli auttaa kattavassa lähestymistavassa Java-sarjan käsitteeseen sekä reaaliaikaisia ​​esimerkkejä ymmärryksen parantamiseksi.

Sarjallisuus on tärkeä käsite, joka käsittelee objektien muuntamista tavuvirraksi java-objektien kuljettamiseksi yhdestä Java-virtuaalikoneesta toiseen ja uudelleen luomiseksi alkuperäiseen muotoon. Yhdistän tämän artikkelin telineen seuraavasti:

Mikä on Java-sarjallisuus?

Sarjaus Java on prosessi, jolla muunnetaan Java-koodi Esine osaksi a Tavuvirta , siirtää objektikoodi Java-virtuaalikoneesta toiseen ja luoda se uudelleen Deserialisaatio.





Serialization-in-Java-Edureka-Picture-1

Miksi tarvitsemme sarjallisuuden Java-kielellä ?

Tarvitsemme sarjallisuuden seuraavista syistä:



  • Viestintä : Sarjaaminen sisältää objektimenettelyn sarjallisuus ja tarttuminen. Tämän avulla useat tietokonejärjestelmät voivat suunnitella, jakaa ja suorittaa objekteja samanaikaisesti.

  • Välimuisti : Kohteen rakentamiseen kuluva aika on enemmän verrattuna aikaan, joka vaaditaan sen sarjastamisen poistamiseen. Sarjaaminen minimoi ajan kulutuksen välimuisti jättiläiset esineet.

  • Syvä kopio : Kloonaus prosessi tehdään yksinkertaiseksi käyttämällä sarjallisuutta. Tarkka kopio kohteen avulla saadaansarjanumerointi objektille a tavu taulukko ja poista sen sarjasarja.



  • Ylittää JVM-synkronointi: Serialisaation suurin etu on setoimii eri JVM: issä, jotka saattavat olla käynnissä eri arkkitehtuurit tai Käyttöjärjestelmät

  • Sitkeys: Minkä tahansa objektin tila voidaan tallentaa suoraan soveltamalla siihen sarjallisuutta ja tallentamalla a tietokanta jotta se voi olla haettu myöhemmin.

Kuinka objektia sarjoitetaan?

TO Java-objekti On sarjoitettavissa jos ja vain, jos sen luokka tai jokin sen emoluokista toteuttaa joko java . Minä . Sarjattavissa käyttöliittymä tai sen alaosa, java.io. ulkoistettavissa.

Sarjallisuusprosessissa muunnamme objektin tilan tavuvirraksi, jotta se voidaan siirtää yhdestä JVM: stä toiseen, ja palautamme tavuvirran takaisin alkuperäiseksi objektiksi.

//Käyttöliittymä

paketti Serial1 tuo java.io.Serializable public class Työntekijä toteuttaa Serializable {private static final long serialVersionUID = 1L // Sarjaversio UID int id Merkkijonon nimi public Employee (int id, String name) {this.id = id this.name = name }}

//Sarjallistaa

paketti Sarja1 tuo java.io. * luokka Pysy {public static void main (String args []) {try {Employee emp1 = new Employee (20110, 'John') Employee emp2 = new Employee (22110, 'Jerry') Employee emp3 = new Employee (20120, 'Sam') FileOutputStream fout = new FileOutputStream ('output.txt') ObjectOutputStream out = new ObjectOutputStream (fout) out.writeObject (emp1) out.writeObject (emp2) out.writeObject (emp3) out. huuhtele () out.close () System.out.println ('Serialisaatio ja deserialisaatio on suoritettu onnistuneesti')} catch (Poikkeus e) {System.out.println (e)}}}

Tuotos:

Serialisaatio ja deserialisaatio on suoritettu onnistuneesti

Deserialisaatio : Se on käänteinen sarjallisuusprosessi, jossa lähettäjän objektin sarjattu tavuvirta luodaan uudelleen vastaanottavassa päässä.

// Deserialise

paketti Serial1 tuo java.io. * luokka Depersist {public static void main (String args []) {kokeile {ObjectInputStream sisään = uusi ObjectInputStream (uusi FileInputStream ('output.txt')) työntekijä e1 = (työntekijä) in.readObject ( ) Työntekijä e2 = (Työntekijä) in.readObject () Työntekijä e3 = (Työntekijä) sisään.readObject () System.out.println (e1.id + '' + e1.nimi) System.out.println (e2.id + '') + e2.nimi) System.out.println (e3.id + '' + e3.name) in.close ()} catch (Poikkeus e) {System.out.println (e)}}}

Tuotos:

20110 John
22110 Jerry

20120 Sam

Java-sarjanumeroinnin edut ja haitat

Edut:

taulukon tiedot sekoittuvat vasempaan liittymään
  • Sarjallisuusprosessi on a sisäänrakennettu ominaisuus, joka ei vaadi kolmannen osapuolen ohjelmistoja Serialisoinnin suorittamiseen
  • Serialisointimenettely on osoittautunut yksinkertainen ja helppo ymmärtää

  • Sarjatoimenpide on universaali ja kehittäjät eri taustoista ovat sille tuttuja

  • Se on helppo käyttää ja helppo muokata

  • Sarjatut tietovirrat tuki salaus, pakkaus, todennus ja suojattu Java-tietojenkäsittely

  • On paljon kriittisiä tekniikoita luottaa sarjallisuuteen.

Haitat:

  • Kohteita, kun DeSerialization muuttuu hauras eivätkä he ole varmoja siitä, että ne ovat DeSerialized tehokkaasti.

  • Serialisaation yhteydessä ilmoitetut transienttimuuttujat, kun taas sarjallisuus luo muistitilaa, mutta konstruktoria ei kutsuta, mikä johtaa epäonnistumiseen transienttimuuttujien alustusessa muunnelma Java-vakiovirtaan.

  • Sarjallisuusprosessi on tehoton muistin hyödyntämisen kannalta.

  • Sarjoitusta ei ole suositeltavaa käyttää sovelluksissa, jotka tarvitsevat samanaikainen käyttö ilman vaatimusta kolmannen osapuolen sovellusliittymät , koska sarjallisuus ei tarjoa mitään siirtymänohjausmekanismia jokaista SE: tä kohti.

  • Sarjoitusmenettelyä ei voida tarjota hienorakeinen ohjaus päästäksesi kohteisiin.

Käytännön esimerkkejä Java-sarjoinnista

Sarjaaminen perinnöllä

Tapaus - 1: Jos Superclass on sarjoitettavissa, oletusarvoisesti myös sen alaluokat ovat sarjoitettavissa.

Tässä tapauksessa alaluokka on sarjoitettavissa oletusarvoisesti, jos superluokka toteuttaa Serialisoitava käyttöliittymä

paketti SerializationInheritance import java.io.FileInputStream import java.io.FileOutputStream import java.io.ObjectInputStream import java.io.ObjectOutputStream import java.io.Serializable class A toteuttaa Serializable {int i public A (int i) {this.i = i}} luokka B laajentaa A {int j public B (int i, int j) {super (i) this.j = j}} public class Test {public static void main (String [] args) heittää poikkeuksen {B b1 = uusi B (200 400) System.out.println ('i =' + b1.i) System.out.println ('j =' + b1.j) FileOutputStream fos = uusi FileOutputStream ('abc.ser') ObjectOutputStream oos = new ObjectOutputStream (fos) oos.writeObject (b1) oos.close () fos.close () System.out.println ('Objekti on sarjoitettu') FileInputStream fis = new FileInputStream ('abc.ser') ObjectInputStream ois = uusi ObjectInputStream (fis) B b2 = (B) ois.readObject () ois.close () fis.close () System.out.println ('Kohde on deserialisoitu') System.out.println ('i = '+ b2.i) System.out.println (' j = '+ b2.j)}}

Tuotos:

j = 20
Kohde on sarjoitettu
Kohde on deserialisoitu
i = 200
j = 400

Tapaus - 2: Alaluokka voidaan sarjoittaa, jos se ottaa käyttöön sarjoitettavan käyttöliittymän, vaikka superluokka ei toteuttaisikaan sarjaliitettävää käyttöliittymää.

Tässä tapauksessa, jos superluokka ei toteuta Serialisoitava käyttöliittymä , sitten objektit alaluokka voidaan sarjallistaa manuaalisesti toteuttamalla Serializable Interface alakategoriassa.

package SerializationInheritance import java.io.FileInputStream import java.io.FileOutputStream import java.io.ObjectInputStream import java.io.ObjectOutputStream import java.io.Serializable class superclass {int i public superclass (int i) {this.i = i} julkinen superluokka () {i = 50 System.out.println ('Superclass constructor nimeltä')}} -luokan aliluokka laajentaa superluokan työvälineitä Serialisoitava {int j julkinen aliluokka (int i, int j) {super (i) tämä.j = j }} public class test2 {public static void main (String [] args) heittää poikkeuksen {alaluokka b1 = uusi alaluokka (10, 20) System.out.println ('i =' + b1.i) System.out.println ( 'j =' + b1.j) FileOutputStream fos = uusi FileOutputStream ('output.ser') ObjectOutputStream oos = uusi ObjectOutputStream (fos) oos.writeObject (b1) oos.close () fos.close () System.out.println ('Objekti on sarjoitettu') FileInputStream fis = new FileInputStream ('output.ser') ObjectInputStream ois = new ObjectInputStream (fis) subclass b2 = (subclass) ois.readObject ( ) ois.close () fis.close () System.out.println ('Objekti on deserialisoitu') System.out.println ('i =' + b2.i) System.out.println ('j =' + b2.j)}}

Kohde on sarjoitettu
Superclass-rakentaja soitti
Kohde on deserialisoitu
i = 50
j = 20

Tapaus 3: Jos yliluokka on sarjoitettavissa, mutta emme tarvitse aliluokkaa sarjoitettavaksi.

Tällöin alaluokan sarjallisuus voidaan estäätoteuttamalla writeObject () ja readObject () menetelmiä alaluokassa ja se on heitettävä NotSerializableException näistä menetelmistä.

paketti SerializationInheritance import java.io.FileInputStream import java.io.FileOutputStream import java.io.IOException import java.io.NotSerializableException import java.io.ObjectInputStream import java.io.ObjectOutputStream import java.io.ObjectOutputStream import java.io.io.io Parametrit {0} i public Vanhempi (int i) {this.i = i}} luokan lapsi laajentaa vanhempaa {int j public child (int i, int j) {super (i) this.j = j} private void writeObject (ObjectOutputStream out) heittää IOException {heittää uusi NotSerializableException ()} yksityinen void readObject (ObjectInputStream in) heittää IOException {heittää uuden NotSerializableException ()}} julkisen luokan test3 {public static void main (String [] args) heittää poikkeuksen {child b1 = new child (100, 200) System.out.println ('i =' + b1.i) System.out.println ('j =' + b1.j) FileOutputStream fos = uusi FileOutputStream ('abc.ser') ObjectOutputStream oos = uusi ObjectOutputStream ( fos) oos.writeObject (b1) oos.close () fos.close () System.out.println ('objekti on sarjoitettu ') FileInputStream fis = new FileInputStream (' abc.ser ') ObjectInputStream ois = new ObjectInputStream (fis) child b2 = (child) ois.readObject () ois.close () fis.close () System.out. println ('Objekti on poistettu käytöstä') System.out.println ('i =' + b2.i) System.out.println ('j =' + b2.j)}}

Tuotos:

i = 100
j = 200
Poikkeus säikeessä 'main' java.io.NotSerializableException
osoitteessa SerializationInheritance.child.writeObject (test3.java:48)
at sun.reflect.NativeMethodAccessorImpl.invoke0 (alkuperäinen menetelmä)

Sarjaaminen staattisen jäsenen avulla

Staattisen jäsenkentän sarjallisuutta ei oteta huomioon sarjallisuudessa. Sarjaaminen onliittyvät kohteen uusimpaan tilaan. Siksi vain luokan tiettyyn esiintymään liittyvät tiedot ovatsarjoitettu, mutta ei Staattinen jäsen -kenttää.

package stati import java.io. * class StaticSerial toteuttaa Serializable {static int i = 100 public static void main (String ... ar) {StaticSerial ob = new StaticSerial () System.out.println ('Serialisoinnin aikana, staattisella jäsenellä on arvo: '+ i) kokeile {FileOutputStream fos = new FileOutputStream (' F: File.ser ') ObjectOutputStream oos = new ObjectOutputStream (fos) oos.writeObject (ob) oos.close () i = 99 FileInputStream fis = uusi FileInputStream ('F: File.ser') ObjectInputStream ois = uusi ObjectInputStream (fis) ob = (StaticSerial) ois.readObject () ois.close () System.out.println ('Deserialisoinnin jälkeen staattisella jäsenellä on arvo:' + i)} saalis (poikkeus e) {System.out.println (e)}}}

Tuotos:

Sarjallisuuden aikaan staattisen jäsenen arvo on 100
Deserialisoinnin jälkeen staattisella jäsenellä on arvo: 99

Ulkopuolinen käyttöliittymä

Ulkopuolinen käyttöliittymä Java on samanlainen kuin sarjallisuus, mutta ainoa ero on, että se pystyy tarjoamaan räätälöity sarjanumerointi missä pääset päättämään streamin haavoittuvat objektit.

Ulkoistettava käyttöliittymä on saatavana java.io-sivustossa ja tarjoaa kaksi tapaa:

  • public void writeExternal (ObjectOutput out) heittää IOExceptionin
  • public void readExternal (ObjectInput in) heittää IOExceptionin

Tärkeimmät erot sarjallisuuden ja ulkoistettavuuden välillä ovat seuraavat:

  • Toteutus : Ulkopuolinen käyttöliittymä houkuttelee käyttäjää nimenomaisesti mainita sarjoitettavat objektit. Sarjallisuusrajapinnassa kaikki objektit ja muuttujat sarjoitetaan ajoaika.

  • Menetelmät : Ulkopuolinen käyttöliittymä koostuu kahdesta menetelmästä, nimittäin:

    mitä siinä on__
    • writeExternal ()

    • readExternal ()

Serialisoitava käyttöliittymä ei sisällä mitään menetelmiä.

  • Prosessi: Serialisointiprosessi ulkoistettavassa käyttöliittymässä tarjoaa räätälöinti sarjakuvaprosessiin. Mutta Serialisointiliitäntä tarjoaa oletuksena sarjallisuusprosessi.

  • Taaksepäin yhteensopivuus ja hallinta: Ulkopuolinen käyttöliittymä tukee sarjallisuutta riippumatta versionhallinta ja ainoa ongelma on, että käyttäjän on oltava vastuussa Super Class -sarjan sarjoinnista. Toisaalta, Serialization Interface vaatii sama versio JVM: ien molemmissa päissä, mutta se sisältää kaikkien objektien ja luokkien automaattisen sarjoituksen, mukaan lukien yliluokka.

  • Julkinen ei-argumenttirakentaja: Ulkoistamisen käyttöliittymä tarvitsee Julkinen ei-argumenttirakentaja rekonstruoida sarjoitettu objekti. Serialisointiliitäntä ei vaadi No-Arg Constructor -ohjelmaa, vaan käyttää pohdintaa rekonstruoida sarjoitettu objekti tai luokka.

package ext import java.io. * class Demo toteuttaa java.io.Serializable {public int a public String b public demo (int a, String b) {this.a = a this.b = b}} class Test {public static void main (String [] args) {Demo object = new Demo (1, 'Welcome to Edureka') String filename = 'file.ser' try {FileOutputStream file = new FileOutputStream (filename) ObjectOutputStream out = new ObjectOutputStream (file) out .writeObject (object) out.close () file.close () System.out.println ('Objekti on sarjatuotettu')} catch (IOException ex) {System.out.println ('IOException on kiinni')} Demo-objekti1 = null kokeile {FileInputStream-tiedosto = uusi FileInputStream (tiedostonimi) ObjectInputStream sisään = uusi ObjectInputStream (tiedosto) object1 = (esittely) in.readObject () sisään.close () file.close () System.out.println ('objekti on deserialized ') System.out.println (' a = '+ object1.a) System.out.println (' b = '+ object1.b)} catch (IOException ex) {System.out.println (' IOException on kiinni ')} catch (ClassNotFoundException ex) {System.out .println ('ClassNotFoundException on kiinni')}}}

Ohimenevä avainsana

Ohimenevä avainsana on a varattu avainsana Java-kielellä. Sitä käytetään a muuttuja muokata Serialisointiprosessin aikana. Muuttujan ilmoittaminen Transient-avainsanalla välttää muuttujan sarjallisuuden.

Sarjaversio UID

Ennen sarjallisuuden aloittamista jokainen sarjoitettava luokka / objekti liitetään a: han yksilöllinen tunnistenumero tarjoaa isäntäkoneen JVM. Tätä yksilöllistä tunnusta kutsutaan Sarjaversio UID . Tätä UID: tä käytetään JVM: n tunnisteena vastaanottopäästä vahvistamaan, että samaa objektia DeSerialisoidaan vastaanottopäässä.

Javan sarjallisuuden kiistat

Oraclen Arkkitehdit aikovat poistaa sarjallisuuden Java-ohjelmasta, koska heidän mielestään se on Kauhea virhe vuonna 1997 . Kiireisen tutkimuksen jälkeen Oraclen kehittäjät löysivät muutamia puutteita Serialization-menettelyn suunnittelussa, jotka uhkaavat tietoja.

Vuonna 1997Mark Reinhold toteaa - “ Haluamme kutsua sarjallisuutta 'lahjaksi, joka antaa jatkuvasti', ja sen tyyppinen lahja, jota se antaa, on tietoturva-aukkoja. Todennäköisesti kolmasosa kaikista Java-haavoittuvuuksista on liittynyt sarjaan, se voi olla yli puolet. Se on hämmästyttävän hedelmällinen haavoittuvuuksien lähde, puhumattakaan epävakaisuuksista. '

On mahdollista, että sarjallisuus poistetaan tai korvataan tulevissa Java-päivityksissä ja toisaalta Java-aloittelijoille, Serialisaatio ei pystynyt olla idealistinen vaihtoehto heidän hankkeissaan

Parhaat käytännöt, kun käytät Serialisointia Javassa

Seuraavassa on muutamia parhaita käytäntöjä, joita on noudatettava

  • On suositeltavaa käyttää javadoc @ sarjatunniste Serialisoitavien kenttien merkitsemiseksi.
  • .olla Laajennusta suositellaan käytettäväksi tiedostoille, jotka edustavat sarjoitettuja esineitä.
  • Ei ole suositeltavaa suorittaa mitään staattisia tai ohimeneviä kenttiä oletusarvo.
  • Laajennettavat luokat ei tule sarjata, ellei se ole pakollinen.
  • Sisäiset luokat tulisi välttää osallistumista sarjallisuuteen.

Tämän avulla olemme päässeet tämän artikkelin loppuun. Toivon, että olet ymmärtänyt Java-sarjan sarjallisuuden perusteet, sen tyypit ja toiminnot.

Katso Edureka, luotettava verkko-oppimisyritys, jolla on yli 250 000 tyytyväisen oppijan verkosto, joka levisi ympäri maailmaa. Edurekan Java J2EE- ja SOA-koulutus- ja sertifiointikurssit on suunniteltu opiskelijoille ja ammattilaisille, jotka haluavat olla Java-kehittäjiä. Kurssi on suunniteltu antamaan sinulle etumatka Java-ohjelmointiin ja kouluttamaan sekä ydin- että edistyneitä Java-konsepteja sekä erilaisia ​​Java-kehyksiä, kuten Hibernate & kevät .

Onko sinulla kysymys meille? Mainitse se tämän Serialization in Java -artikkelin kommenttiosassa, niin otamme sinuun yhteyttä mahdollisimman pian.