Indledning

Serialisering er omdannelse af et objekt i en byte stream; deserialization gør det modsatte. Angivet forskelligt er serialisering konverteringen af et Java-objekt til en statisk strøm (sekvens) af bytes, som derefter kan gemmes i en database eller overføres via et netværk.

serialisering og deserialisering

serialiseringsprocessen er instansuafhængig, dvs., objekter kan føljeton på Onn platform og deseriali .ed på en anden. Klasser, der er berettiget til serialisering nødt til at gennemføre en særlig markør interface Serialiableable.

både ObjectInputStream og ObjectOutputStream er klasser på højt niveau, der udvider henholdsvis java.io.InputStream og java.io.OutputStream. ObjectOutputStream kan skrive primitive typer og grafer af objekter til en OutputStream som en strøm af bytes. Disse strømme kan efterfølgende læses ved hjælp af ObjectInputStream.,

Den vigtigste metode i ObjectOutputStream er:

public final void writeObject(Object o) throws IOException;

Som tager et objekt serialiseres, og omdanner det til en sekvens (stream) af byte. Tilsvarende er den vigtigste metode i ObjectInputStream:

public final Object readObject() throws IOException, ClassNotFoundException;

som kan læse en strøm af bytes og konvertere den tilbage til et Java-objekt. Dette kan derefter kastes tilbage til det originale objekt.

lad os illustrere serialisering med en personklasse. Bemærk, at statiske felter tilhører en klasse (i modsætning til et objekt) og ikke føljeton., Bemærk også, at vi kan bruge nøgleordet transient at ignorere klasse felter under serialisering:

public class Person implements Serializable { private static final long serialVersionUID = 1L; static String country = "ITALY"; private int age; private String name; transient int height; // getters and setters}

test nedenfor er vist et eksempel på at spare et objekt af typen Person til en lokal fil, så læs denne værdi tilbage i:

Vi har brugt ObjectOutputStream for at spare staten for dette objekt til en fil ved hjælp FileOutputStream. Filen ” dinfil.t .t ” oprettes i projektmappen. Denne fil indlæses derefter ved hjælp af FileInputStream. ObjectInputStream henter denne strøm op og konverterer den til et nyt objekt kaldet P2.,

endelig tester vi tilstanden for det indlæste objekt, og det matcher tilstanden for det originale objekt.

Bemærk, at det indlæste objekt eksplicit skal kastes til en persontype.

Java serialisering forbehold

Der er nogle advarsler, der vedrører serialisering i Java.

3.1. Arv og sammensætning

Når en klasse implementerer java.io.Serialiableable-grænsefladen, kan alle dens underklasser også serialiseres., Tværtimod, når et objekt har en reference til et andet objekt, kan disse objekter, skal implementere Serializable-interfacet separat, eller en NotSerializableException vil blive smidt:

public class Person implements Serializable { private int age; private String name; private Address country; // must be serializable too}

Hvis et af felterne i en serializable objekt består af en række genstande, så er alle disse genstande skal være serializable som godt, ellers et NotSerializableException vil blive kastet.

3, 2. Seriel Version uid

JVM knytter et versionsnummer (langt) til hver serialiserbar klasse., Det bruges til at kontrollere, at de gemte og indlæste objekter har de samme attributter og dermed er kompatible på serialisering.

dette nummer kan genereres automatisk af de fleste IDE ‘ er og er baseret på klassenavnet, dets attributter og tilhørende adgangsmodifikatorer. Eventuelle ændringer resulterer i et andet antal og kan forårsage en Invalidclasse .ception.

Hvis en serialiserbar klasse ikke erklærer en serialVersionUID, vil JVM generere en automatisk ved run-time., Det anbefales dog stærkt, at hver klasse erklærer sin serialVersionUID, da den genererede er kompilatorafhængig og dermed kan resultere i uventede Invalidclasse .ceptions.

3.3. Brugerdefineret serialisering i Java

Java angiver en standard måde, hvorpå objekter kan serialiseres. Java klasser kan tilsidesætte denne standard adfærd. Brugerdefineret serialisering kan være særlig nyttig, når man forsøger at serialisere et objekt, der har nogle ikke-serialiserbare attributter., Dette kan gøres ved at give to metoder inde i klassen, at vi ønsker at føljeton:

private void writeObject(ObjectOutputStream out) throws IOException;

og

private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException;

Med disse metoder, kan vi føljeton de ikke-serialis \ attributter i andre former, der kan være føljeton:

public class Address { private int houseNumber; // setters and getters}

følgende unit test test denne skik serialisering:

I koden, kan vi se, hvordan man kan spare nogle ikke-serialis \ attributter ved fortløbende Adresse med brugerdefinerede serialisering. Bemærk, at vi skal markere de ikke-serialiserbare attributter som forbigående for at undgå Notserialiableablee .ception.,

konklusion

i denne hurtige tutorial har vi gennemgået Java-serialisering, diskuteret vigtige ting at huske på og har vist, hvordan man gør brugerdefineret serialisering.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *