hvad forårsager problemer med deserialisering?
Jeg vil gerne give dig lidt baggrund, før jeg besvarer dit spørgsmål,
Serialiseringskørselstiden knytter til hver serialiserbar klasse et versionsnummer, kaldet en serialVersionUID, som bruges under deserialisering til at verificere, at afsenderen og modtageren af et serialiseret objekt har indlæst klasser for det objekt, der er kompatible med hensyn til serialisering. Hvis modtageren har indlæst en klasse for objektet, der har en anden serialVersionUID end den for den tilsvarende afsenderes klasse, vil deserialisering resultere i en InvalidClassException.
Hvis en serialiserbar klasse ikke eksplicit erklærer et serialVersionUID, så vil serialiseringens runtime beregne en standard serialVersionUID-værdi for den klasse baseret på forskellige aspekter af klassen. Den bruger følgende information om klassen til at beregne SerialVersionUID,
- Klassens navn.
- Klassemodifikatorerne skrevet som et 32-bit heltal.
- Navnet på hver grænseflade sorteret efter navn.
- For hvert felt i klassen sorteret efter feltnavn (undtagen private statiske og private forbigående felter:
- Navnet på feltet.
- Feltets modifikatorer skrevet som et 32-bit heltal.
- Feltets beskrivelse.
-
hvis der findes en klasseinitializer, skal du skrive følgende:
Navnet på metoden, .
Metodens modifikator, java.lang.reflect.Modifier.STATIC, skrevet som et 32-bit heltal.
Metodens deskriptor, ()V.
-
For hver ikke-privat konstruktør sorteret efter metodenavn og signatur:
Navnet på metoden, .
Modifikatorerne for metoden skrevet som et 32-bit heltal.
Metodens beskrivelse.
-
For hver ikke-privat metode sorteret efter metodenavn og signatur:
Navnet på metoden.
Modifikatorerne for metoden skrevet som et 32-bit heltal.
Metodens beskrivelse.
Så for at besvare dit spørgsmål,
Vil en fjernelse af en offentlig/privat ejendom forårsage et problem? Tilføjelse af nye ejendomme, måske? Vil en tilføjelse af en ny funktion til klassen skabe problemer? Hvad med flere konstruktører?
Ja, alle disse tilføjelser/fjernelser vil som standard forårsage problemet.
Men en måde at overvinde dette på er eksplicit at definere SerialVersionUID, dette vil fortælle serialiseringssystemet, at jeg ved, at klassen vil udvikle sig (eller udviklet sig) over tid og ikke smide en fejl. Så de-serialiseringssystemet læser kun de felter, der er til stede i begge sider og tildeler værdien. Nyligt tilføjede felter på de-serialiseringssiden får standardværdierne. Hvis nogle felter slettes på deserialiseringssiden, læser og springer algoritmen bare.
Følgende er den måde, man kan erklære SerialVersionUID på,
private static final long serialVersionUID = 3487495895819393L;