Ik loop nu tegen een probleem aan en ik begrijp niet waarom dit gedrag word vertoont en hoe ik het op moet lossen. Ik zal het uitleggen zodat het probleem duidelijk word. De classes die ik laat zien heb ik even zwaar ingekort en versimpeld aangezien de originele data niet van belang is voor dit probleem.
Ik heb de volgende class met enkele velden:
Nu heb ik van bovenstaande class een object en die serialize ik naar een file genaamd settings.set. Dit bestand sla ik ergens op op de hardeschijf. Als ik vervolgens het settings.set bestand inlees om er weer een object van te maken krijg ik logischerwijs een object waar zowel value1 als value2 beide true zijn. Nu komt het probleem. Ik heb nog steeds het geserialiseerde bestand op mijn computer staan. Nu voeg ik aan mijn class een derde field toe genaamd value3. Ook deze zet ik standaard op true. Dus ik heb dit:
Vervolgens open ik mijn settingsfile waar het nieuwe veld (value3) en waarde nog niet bestaat. Ga ik vervolgens de inhoud van het object bekijken zie ik iets wat ik niet verwacht had. Value1 en value2 zijn beide true, maar value3 is false. Voor zover mij bekend is dat de default waarde van een boolean. Op een of andere manier word bij het toevoegen van een field altijd de default value gebruikt. Op deze manier bouw ik mijn object vanuit de geserializeerde file:
en save ik een object:
Nog even in het kort:
- Serializeer object (met writeObject())
- Voeg field aan class toe
- Deserializeer opgeslagen object (met readObject())
- nieuwste field heeft default waarde ipv ingestelde waarde.
Waarom gebeurd dit? Dit is niet wat ik verwacht had. En hoe moet ik dit probleem nu eenvoudig oplossen. Veel verder als implementeer een eigen readObject kom ik niet met google. Wie kan mij verder op weg helpen?
Ik heb de volgende class met enkele velden:
Java:
1
2
3
4
5
6
7
8
9
10
| public class Settings implements Serializable{ private static final long serialVersionUID = 20L; private boolean value1 = true; private boolean value2 = true; public Settings(){ } //Setters en Getters van de velden } |
Nu heb ik van bovenstaande class een object en die serialize ik naar een file genaamd settings.set. Dit bestand sla ik ergens op op de hardeschijf. Als ik vervolgens het settings.set bestand inlees om er weer een object van te maken krijg ik logischerwijs een object waar zowel value1 als value2 beide true zijn. Nu komt het probleem. Ik heb nog steeds het geserialiseerde bestand op mijn computer staan. Nu voeg ik aan mijn class een derde field toe genaamd value3. Ook deze zet ik standaard op true. Dus ik heb dit:
Java:
1
2
3
4
5
6
7
8
9
10
11
| public class Settings implements Serializable{ private static final long serialVersionUID = 20L; private boolean value1 = true; private boolean value2 = true; private boolean value3 = true; public Settings(){ } //Setters en Getters van de velden } |
Vervolgens open ik mijn settingsfile waar het nieuwe veld (value3) en waarde nog niet bestaat. Ga ik vervolgens de inhoud van het object bekijken zie ik iets wat ik niet verwacht had. Value1 en value2 zijn beide true, maar value3 is false. Voor zover mij bekend is dat de default waarde van een boolean. Op een of andere manier word bij het toevoegen van een field altijd de default value gebruikt. Op deze manier bouw ik mijn object vanuit de geserializeerde file:
Java:
1
2
3
4
5
6
7
8
9
10
| Settings settings = null; FileInputStream fis = null; ObjectInputStream in = null; try { fis = new FileInputStream("C:\\Settings.set"); in = new ObjectInputStream(fis); settings = (Settings) in.readObject(); in.close(); } |
en save ik een object:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
| if(targetLocation.exists()){ targetLocation.delete(); //Ik moet eerst even het bronbestand weggooien omdat ik met onderstaande code geen file kan overschrijven. } try{ //Write Object FileOutputStream fos = null; ObjectOutputStream out = null; fos = new FileOutputStream("C:\\Settings.set"); out = new ObjectOutputStream(fos); out.writeObject(settings); out.close(); return true; } |
Nog even in het kort:
- Serializeer object (met writeObject())
- Voeg field aan class toe
- Deserializeer opgeslagen object (met readObject())
- nieuwste field heeft default waarde ipv ingestelde waarde.
Waarom gebeurd dit? Dit is niet wat ik verwacht had. En hoe moet ik dit probleem nu eenvoudig oplossen. Veel verder als implementeer een eigen readObject kom ik niet met google. Wie kan mij verder op weg helpen?
Ruisende versterker: schakel je subwoofer in.