so basically serialisatie is een proces van het omzetten van een object in een opeenvolging van bytes die kan worden gehandhaafd op een schijf of database of kan worden verzonden via streams. Het omgekeerde proces van het creëren van object uit de opeenvolging van bytes wordt deserialisatie genoemd.
serialisatie en deserialisatie in java
om ons object te serialiseren en deserialiseren naar een bestand moeten we ObjectOutputStream.writeObject()
en ObjectInputStream.readObject()
aanroepen .,
Een klasse moet Serialiseerbare interface in java.io
pakket implementeren om het object succesvol te serialiseren. Serialisable is een marker interface die serialiseerbaar gedrag toevoegt aan de klasse die het implementeert.
Java biedt Serializable API ingekapseld onder java.io
pakket voor serialisatie en deserialisatie objecten omvatten,
java.io.serializable
java.io.Externalizable
ObjectInputStream
en ObjectOutputStream
etc.,
Punten 1. Als een ouderklasse Serialiseerbare interface heeft geïmplementeerd, hoeft child class deze niet te implementeren, maar vice versa is niet waar. 2. Alleen niet-statische gegevens leden worden opgeslagen via serialisatie proces. 3. Statische gegevens leden en tijdelijke gegevens leden worden niet opgeslagen via serialisatie process.So, als u de waarde van een niet-statisch gegevenslid niet wilt opslaan, maak het dan tijdelijk. 4., Constructeur van object wordt nooit genoemd wanneer een object is gedeserialiseerd. 5. Geassocieerde objecten moeten Serialiseerbare interface implementeren.
SerialVersionUID De serialisatie runtime associeert een versienummer met elke Serialiseerbare Klasse, Een SerialVersionUID genaamd, die tijdens deserialisatie wordt gebruikt om te controleren of afzender en ontvanger van een serialized object klassen voor dat object geladen hebben die compatibel zijn met serialisatie., Als de ontvanger een klasse heeft geladen voor het object dat een andere UID heeft dan die van de corresponderende sender ‘ s klasse, zal de deserialisatie resulteren in een ongeldige class Exception. Een Serialiseerbare klasse kan zijn eigen UID expliciet declareren door een veldnaam te declareren. Het moet statisch, definitief en van het type lang zijn. i.,e-ANY-ACCESS-MODIFIER static final long serialVersionUID=42L;
als een serialiseerbare klasse niet expliciet een serialVersionUID declareert, dan zal de serialisatie runtime een standaard voor die klasse berekenen op basis van verschillende aspecten van de klasse, zoals beschreven in Java Object serialisatie specificatie. Het wordt echter sterk aanbevolen dat alle serialiseerbare klassen expliciet serialVersionUID waarde verklaren, omdat de berekening ervan zeer gevoelig is voor class details die kunnen variëren afhankelijk van compiler implementaties, elke verandering in klasse of het gebruik van een andere id kan de serialized gegevens beïnvloeden.,
Het wordt ook aanbevolen om private modifier te gebruiken voor UID omdat het niet nuttig is als overgenomen lid.
in het geval van transient variables:- een variabele gedefinieerd met transient keyword wordt niet geserialiseerd tijdens het serialisatieproces.Deze variabele zal worden geïnitialiseerd met de standaard waarde tijdens deserialisatie. (bijvoorbeeld: voor objecten is het null, voor Int is het 0). in het geval van statische variabelen:- een variabele gedefinieerd met statisch trefwoord wordt niet geserialiseerd tijdens het serialisatieproces.Deze variabele zal worden geladen met de huidige waarde gedefinieerd in de klasse tijdens deserialisatie.,
serialisatie in java
deserialisatie
Contactveld is null omdat het gemarkeerd was als statisch en zoals we eerder hebben besproken, worden statische velden niet geserialiseerd.
opmerking: statische leden worden nooit geserialiseerd omdat ze verbonden zijn met class not object of class.
serialisatie is het proces van het opslaan van de status van een object in een reeks van bytes die vervolgens kan worden opgeslagen in een bestand of verzonden over het netwerk en deserialisatie is het proces van het reconstrueren van een object uit die bytes.,
alleen subklassen van deSerializable
interface kunnen geserialiseerd worden.
als onze klasse Serializable
interface niet implementeert of als het een verwijzing heeft naar een niet Serializable
klasse dan zal JVM NotSerializableException
gooien.
alle transient
en static
velden worden niet geserialiseerd.
de serialVersionUID
wordt gebruikt om te controleren of de geserialiseerde en gedeserialiseerde objecten dezelfde attributen hebben en dus compatibel zijn met deserialisatie.,
we zouden een serialVersionUID
veld in onze klasse moeten aanmaken, dus als we onze klassenstructuur wijzigen (velden toevoegen/verwijderen) zal JVM niet door InvalidClassException
. Als we het niet opgeven, levert JVM er een die kan veranderen wanneer onze klassenstructuur verandert.
We kunnen het standaard serialisatiegedrag binnen onze Java klasse overschrijven door de implementatie van writeObject
en readObject
methoden.,
en we kunnen ObjectOutputStream.defaultWriteObject()
en ObjectInputStream.defaultReadObject
van writeObject
en readObject
methoden aanroepen om de standaard serialisatie en deserialisatie logica te verkrijgen.
we kunnen NotSerializableException
uitzondering van writeObject
en readObject
gooien , als we niet willen dat onze klasse wordt geserialiseerd of gedeserialiseerd.