JavaRush /Blogue Java /Random-PT /Em resposta ao artigo "Por que usar SerialVersionUID dent...
Сергей
Nível 31
Киев

Em resposta ao artigo "Por que usar SerialVersionUID dentro da classe Serializable em Java"

Publicado no grupo Random-PT
Então.. Temos uma classe que queremos serializar usando métodos convencionais (usamos Serializable) Em resposta ao artigo "Por que usar SerialVersionUID dentro da classe Serializable em Java" - 1
package Serialization;

import java.io.Serializable;

public class SerializableClass implements Serializable {
    private String name;
    private int number;
 }
Estamos escrevendo um aplicativo de teste. Direi desde já que meu objetivo é mostrar o que 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();
    }
}
Tudo funciona muito bem. A classe é serializada em um arquivo FILE_NAME = "c:\\File.dat". Estava escurecendo... :) Esqueci de adicionar campos à classe. Adicionar:
public class SerializableClass implements Serializable {
    private String name;
    private int number;
    private String FirstName;   // +
    private String LastName;    // +
 }
Tudo parece estar bem.. tudo compila.. Então executamos main, desserializamos a classe SerializableClassdo arquivo " c:\\File.dat":
public static void main(String[] args) throws IOException, ClassNotFoundException {
    SerializableClass newObject = (SerializableClass) deserialize();
}
Ah... O que fazer...
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)
Em geral, tudo é justo. A classe mudou e é serialVersionUID= -8271479231760195917e serializada no arquivo serialVersionUID= 8129437039424566964. O que fazer agora, o que fazer? Como criar uma instância? Existe uma saída. Precisamos declarar em nossa classe: static final long serialVersionUID, que é igual à serialVersionUIDclasse esmaecida :) no arquivo. Aqueles. dissemos, vá em frente, vou desserializar.. você pode.. suas versões são as mesmas:
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;    // +
}
Lançamos... E.. Tudo funciona. Pelo que entendi, esse erro poderia ter sido evitado se a classe tivesse declarado antecipadamente:
public class SerializableClass implements Serializable {
    static final long serialVersionUID = 1L;

    private String name;
    private int number;
}
Aqueles. não deixamos o Java fazer seus próprios cálculos serialVersionUIDcom base em seus algoritmos (algoritmos bastante complexos). Agora, sempre que uma classe muda, verificamos serialVersionUID = 1L :
public static void main(String[] args) throws IOException, ClassNotFoundException {
    SerializableClass serializableClass = new SerializableClass();

    serialize(serializableClass);

    SerializableClass newObject = (SerializableClass) deserialize();
}
Funciona.. E agora assim:
public class SerializableClass implements Serializable {
    static final long serialVersionUID = 1L;

    //private String name;
    //private int number;
}
Sim.. E então?
public class SerializableClass implements Serializable {
    static final long serialVersionUID = 1L;
    public int A;
    protected String value;
    //private String name;
    //private int number;
}
Legal.. tudo continua funcionando. Então terminei meu primeiro artigo. Queria colocar tudo isso nos comentários, mas não consegui passar pelos símbolos. Aceitarei críticas e comentários sóbrios. PS Obrigado ao autor que me inspirou a fazer estas delícias.. Provavelmente é assim que aprendem :) Boa sorte a todos :)
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION