JavaRush /Java Blog /Random-IT /In risposta all'articolo "Perché utilizzare SerialVersion...
Сергей
Livello 31
Киев

In risposta all'articolo "Perché utilizzare SerialVersionUID all'interno della classe Serializable in Java"

Pubblicato nel gruppo Random-IT
Quindi... Abbiamo una classe che vogliamo serializzare utilizzando metodi convenzionali (usiamo Serializable) In risposta all'articolo "Perché utilizzare SerialVersionUID all'interno della classe Serializable in Java" - 1
package Serialization;

import java.io.Serializable;

public class SerializableClass implements Serializable {
    private String name;
    private int number;
 }
Stiamo scrivendo un'applicazione di prova. Dirò subito che il mio obiettivo è mostrare cosa serialVersionUID.
package Serialization;

import java.io.*;

public class MainSerializable {
    final static String FILE_NAME = "c:\\File.dat";

    public static void serialize(Object object) throws IOException {
        FileOutputStream fileOutputStream = new FileOutputStream(FILE_NAME);
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);

        objectOutputStream.writeObject(object);

        fileOutputStream.close();
        objectOutputStream.close();
    }

    public static Object deserialize() throws IOException, ClassNotFoundException {
        FileInputStream fileInputStream = new FileInputStream(FILE_NAME);
        ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);

        Object object = objectInputStream.readObject();

        objectInputStream.close();

        return object;
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        SerializableClass serializableClass = new SerializableClass();

        serialize(serializableClass);

        SerializableClass newObject = (SerializableClass) deserialize();
    }
}
Tutto funziona alla grande. La classe viene serializzata in un file FILE_NAME = "c:\\File.dat". Si stava facendo buio... :) Ho dimenticato di aggiungere campi alla classe. Aggiungere:
public class SerializableClass implements Serializable {
    private String name;
    private int number;
    private String FirstName;   // +
    private String LastName;    // +
 }
Sembra che tutto vada bene... tutto viene compilato.. Quindi lo eseguiamo main, deserializziamo la classe SerializableClassdal file " c:\\File.dat":
public static void main(String[] args) throws IOException, ClassNotFoundException {
    SerializableClass newObject = (SerializableClass) deserialize();
}
Oh... Cosa fare...
Exception in thread "main" java.io.InvalidClassException: Serialization.SerializableClass; local class incompatible: stream classdesc serialVersionUID = 8129437039424566964, local class serialVersionUID = -8271479231760195917
	at java.base/java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:689)
	at java.base/java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1903)
	at java.base/java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1772)
	at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2060)
	at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1594)
	at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:430)
	at Serialization.MainSerializable.deserialize(MainSerializable.java:22)
	at Serialization.MainSerializable.main(MainSerializable.java:30)
In generale, tutto è giusto. La classe è cambiata ed è serialVersionUID= -8271479231760195917, e serializzata nel file serialVersionUID= 8129437039424566964. Cosa fare adesso, cosa fare? Come creare un'istanza? C'è un'uscita. Dobbiamo dichiarare nella nostra classe: static final long serialVersionUID, che è uguale serialVersionUIDalla classe in grigio :) nel file. Quelli. abbiamo detto, vai avanti, deserializzo.. puoi.. le tue versioni sono le stesse:
package Serialization;

import java.io.Serializable;

public class SerializableClass implements Serializable {
    static final long serialVersionUID = 8129437039424566964L;

    private String name;
    private int number;
    private String FirstName;   // +
    private String LastName;    // +
}
Lanciamo... E.. Tutto funziona. A quanto ho capito questo errore si sarebbe potuto evitare se la classe avesse dichiarato in anticipo:
public class SerializableClass implements Serializable {
    static final long serialVersionUID = 1L;

    private String name;
    private int number;
}
Quelli. non permettiamo a Java di eseguire i propri calcoli serialVersionUIDin base ai suoi algoritmi (algoritmi piuttosto complessi). Ora, ogni volta che una classe cambia, controlliamo serialVersionUID = 1L :
public static void main(String[] args) throws IOException, ClassNotFoundException {
    SerializableClass serializableClass = new SerializableClass();

    serialize(serializableClass);

    SerializableClass newObject = (SerializableClass) deserialize();
}
Funziona... E ora così:
public class SerializableClass implements Serializable {
    static final long serialVersionUID = 1L;

    //private String name;
    //private int number;
}
Sì.. E quindi?
public class SerializableClass implements Serializable {
    static final long serialVersionUID = 1L;
    public int A;
    protected String value;
    //private String name;
    //private int number;
}
Ottimo... tutto continua a funzionare. Così ho finito il mio primo articolo. Avrei voluto mettere tutto questo nei commenti, ma non sono riuscito a superare i simboli. Accetterò critiche e commenti sobri PS Grazie all'autore che mi ha ispirato a fare queste delizie.. Probabilmente è così che imparano :) Buona fortuna a tutti :)
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION