introduktion
serialisering är omvandlingen av tillståndet för ett objekt till en byte ström; deserialisering gör motsatsen. Anges annorlunda, serialisering är omvandlingen av ett Java-objekt till en statisk ström (sekvens) av byte som sedan kan sparas i en databas eller överföras via ett nätverk.
serialisering och deserialisering
serialiseringsprocessen är instansoberoende, dvs., objekt kan serialiseras på en plattform och deserialiseras på en annan. Klasser som är berättigade till serialisering måste implementera ett speciellt markörgränssnitt Serialiserbart.
både ObjectInputStream och ObjectOutputStream är högnivåklasser som utökar java.Io.InputStream respektive java.Io. OutputStream. ObjectOutputStream kan skriva primitiva typer och grafer av objekt till en OutputStream som en ström av byte. Dessa strömmar kan därefter läsas med ObjectInputStream.,
den viktigaste metoden i ObjectOutputStream är:
public final void writeObject(Object o) throws IOException;
som tar ett serialiserbart objekt och omvandlar det till en sekvens (ström) av byte. På samma sätt är den viktigaste metoden i ObjectInputStream:
public final Object readObject() throws IOException, ClassNotFoundException;
som kan läsa en ström av byte och konvertera den tillbaka till ett Java-objekt. Detta kan sedan kastas tillbaka till det ursprungliga objektet.
låt oss illustrera serialisering med en personklass. Observera att statiska fält tillhör en klass (i motsats till ett objekt) och inte serialiseras., Observera också att vi kan använda nyckelordet övergående för att ignorera klassfält 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}
testet nedan visar ett exempel på att spara ett objekt av typen Person till en lokal fil och sedan läsa detta värde tillbaka i:
Vi använde ObjectOutputStream för att spara tillståndet för detta objekt till en fil med FileOutputStream. Filen ”fil.txt ” skapas i projektkatalogen. Den här filen laddas sedan med FileInputStream. ObjectInputStream plockar upp denna ström och omvandlar den till ett nytt objekt som heter P2.,
slutligen testar vi tillståndet för det laddade objektet, och det matchar det ursprungliga objektets tillstånd.
Observera att det laddade objektet måste explicit casta till en persontyp.
Java Serialization Caveats
det finns några varningar som rör serialiseringen i Java.
3.1. Arv och sammansättning
När en klass implementerar java.Io.Serializable-gränssnittet är alla dess underklasser serialiserbara också., Tvärtom, när ett objekt har en hänvisning till ett annat objekt måste dessa objekt implementera det Serialiserbara gränssnittet separat, annars kommer en NotSerializableException att kastas:
public class Person implements Serializable { private int age; private String name; private Address country; // must be serializable too}
om ett av fälten i ett serialiserbart objekt består av en rad objekt, måste alla dessa objekt också vara serialiserbara, annars kommer en NotSerializableException att kastas.
3.2. Seriell version UID
JVM associerar ett versionsnummer (långt) med varje serialiserbar klass., Det används för att verifiera att de sparade och laddade objekten har samma attribut och därmed är kompatibla vid serialisering.
detta nummer kan genereras automatiskt av de flesta IDEs och baseras på klassnamnet, dess attribut och tillhörande åtkomstmodifierare. Eventuella ändringar resulterar i ett annat nummer och kan orsaka en Invalidklassexception.
om en serialiserbar klass inte deklarerar en serialVersionUID kommer JVM att generera en automatiskt vid körning., Det rekommenderas dock starkt att varje klass förklarar sin serialVersionUID eftersom den genererade är kompilatorberoende och därmed kan resultera i oväntade InvalidClassExceptions.
3.3. Anpassad serialisering i Java
Java anger ett standard sätt på vilket objekt kan serialiseras. Java-klasser kan åsidosätta detta standardbeteende. Anpassad serialisering kan vara särskilt användbar när du försöker serialisera ett objekt som har några osterialiserbara attribut., Detta kan göras genom att tillhandahålla två metoder i klassen som vi vill serialisera:
private void writeObject(ObjectOutputStream out) throws IOException;
och
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException;
med dessa metoder kan vi serialisera de oserialiserbara attributen till andra former som kan serialiseras:
public class Address { private int houseNumber; // setters and getters}
följande enhetstesttest testar denna anpassade serialisering:
i den här koden ser vi hur du sparar några oserialiserbara attribut genom att serialisera adress med anpassad serialisering. Observera att vi måste markera de oserializable attributen som övergående för att undvika NotSerializableException.,
slutsats
i denna snabba handledning har vi granskat Java-serialisering, diskuterat viktiga saker att komma ihåg och har visat hur man gör Anpassad serialisering.