Innledning
Serialisering er konvertering av tilstanden til et objekt inn i en byte-strøm; deserialisering gjør det motsatte. Forklart på en annen måte, serialisering er konvertering av et Java-objekt i et statisk strøm (sekvens) av bytes som deretter kan lagres i en database eller overføres over et nettverk.
Serialisering og Deserialisering
serialisering prosessen er eksempel-uavhengig, dvs., objekter kan være serialisert på en plattform og deserialized på en annen. Klasser som er kvalifisert for bedriften trenger for å implementere en spesiell markør grensesnitt Serialiserbare.
Begge ObjectInputStream og ObjectOutputStream er høyt nivå klasser som strekker java.io.InputStream og java.io.OutputStream henholdsvis. ObjectOutputStream kan skrive primitive typer og tabeller av objekter til en OutputStream som en strøm av bytes. Disse bekker kan senere bli lest ved bruk av ObjectInputStream.,
Den viktigste metoden i ObjectOutputStream er:
public final void writeObject(Object o) throws IOException;
Som tar en serialiserbare objekter og konverterer den til en sekvens (stream) byte. På samme måte, er den viktigste metoden i ObjectInputStream er:
public final Object readObject() throws IOException, ClassNotFoundException;
Som du kan lese en strøm av bytes, og konvertere det tilbake til et Java-objekt. Dette kan så bli kastet tilbake til den opprinnelige objektet.
La oss illustrere serialisering med en Person klasse. Merk at statiske felt tilhører en klasse (i motsetning til et objekt), og er ikke serialisert., Vær også oppmerksom på at vi kan bruke søkeordet forbigående å ignorere klasse feltene 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}
testen nedenfor viser et eksempel på lagring av et objekt av typen Person til en lokal fil og deretter lese denne verdien tilbake i:
Vi brukt ObjectOutputStream for å spare staten for dette objektet til en fil ved hjelp av FileOutputStream. Filen «yourfile.txt» er skapt i prosjektet katalogen. Denne filen lastes inn ved hjelp av FileInputStream. ObjectInputStream plukker denne strømmen opp og konverterer det til et nytt objekt som kalles p2.,
til Slutt, vi tester staten som er lastet inn objektet, og det svarer til staten av den opprinnelige objektet.
legg Merke til at det er lagt objektet har til å være eksplisitt kastet til en Person skriver.
Java-Serialisering Begrensninger
Det er noen begrensninger som angår bedriften i Java.
3.1. Arv og Sammensetning
Når en klasse som implementerer java.io.Serialiserbare grensesnitt, alle dens sub-klasser er serialiserbare som godt., Tvert imot, når et objekt har en referanse til et annet objekt, for disse objektene må gjennomføre Serialiserbare grensesnitt separat, eller andre en NotSerializableException vil bli kastet:
public class Person implements Serializable { private int age; private String name; private Address country; // must be serializable too}
Hvis ett av feltene i en serialiserbare objektet består av en rekke objekter, så alle disse objektene må være serialiserbare som godt, og ellers en NotSerializableException vil bli kastet.
3.2. Seriell Versjon UID
JVM tilordner en versjon (lang) antall med hver serialiserbare klasse., Den brukes til å bekrefte at den er lagret og lastet objekter har samme egenskaper og er dermed kompatible på bedriften.
Dette nummeret kan genereres automatisk av de fleste IDEs og er basert på klasse navn, dens egenskaper og tilhørende tilgang modifikatorer. Eventuelle endringer resultere i et ulike antall og kan føre til en InvalidClassException.
Hvis en serialiserbare klasse ikke erklære en serialVersionUID, den JVM vil generere en automatisk ved run-time., Imidlertid, det anbefales sterkt at hver klasse erklærer sin serialVersionUID som genereres er kompilatoren avhengige og dermed kan resultere i uventede InvalidClassExceptions.
3.3. Tilpasset Bedriften i Java
Java angir en standard måte i hvilke objekter som kan være serialisert. Java-klasser kan overstyre denne innstillingen. Tilpasset bedriften kan være spesielt nyttig når du prøver å serialisere et objekt som har noen unserializable attributter., Dette kan gjøres ved å gi to metoder inne i den klassen som vi ønsker å serialisere:
private void writeObject(ObjectOutputStream out) throws IOException;
og
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException;
Med disse metodene, kan vi serialisere de unserializable egenskaper i andre former som kan være serialisert:
public class Address { private int houseNumber; // setters and getters}
følgende unit-test tester denne skikken bedriften:
I denne koden, så ser vi hvordan spare noen unserializable attributter ved serializing Adresse med tilpasset bedriften. Merk at vi må markere unserializable attributter som forbigående å unngå NotSerializableException.,
Konklusjon
I denne rask tutorial, vi har gjennomgått Java-serialisering, diskutert viktige ting å huske på, og har vist hvordan å gjøre tilpasset bedriften.