JavaRush /Java-Blog /Random-DE /Als Antwort auf den Artikel „Warum SerialVersionUID inner...
Сергей
Level 31
Киев

Als Antwort auf den Artikel „Warum SerialVersionUID innerhalb der Serializable-Klasse in Java verwenden?“

Veröffentlicht in der Gruppe Random-DE
Also... Wir haben eine Klasse, die wir mit herkömmlichen Methoden serialisieren möchten (wir verwenden Serializable). Als Antwort auf den Artikel „Warum SerialVersionUID innerhalb der Serializable-Klasse in Java verwenden“ – 1
package Serialization;

import java.io.Serializable;

public class SerializableClass implements Serializable {
    private String name;
    private int number;
 }
Wir schreiben eine Testbewerbung. Ich sage gleich, dass es mein Ziel ist, zu zeigen, was 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();
    }
}
Alles funktioniert super. Die Klasse wird in eine Datei serialisiert FILE_NAME = "c:\\File.dat". Es wurde dunkel... :) Ich habe vergessen, der Klasse Felder hinzuzufügen. Hinzufügen:
public class SerializableClass implements Serializable {
    private String name;
    private int number;
    private String FirstName;   // +
    private String LastName;    // +
 }
Alles scheint in Ordnung zu sein. Alles wird kompiliert. Also führen wir es aus mainund deserialisieren die Klasse SerializableClassaus der Datei „ c:\\File.dat„:
public static void main(String[] args) throws IOException, ClassNotFoundException {
    SerializableClass newObject = (SerializableClass) deserialize();
}
Oh... Was tun...
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)
Im Allgemeinen ist alles fair. Die Klasse wurde geändert und ihr serialVersionUID= wurde in der Datei = -8271479231760195917serialisiert . Was nun tun, was tun? Wie erstelle ich eine Instanz? Es gibt einen Ausgang. Wir müssen in unserer Klasse Folgendes deklarieren: , was der ausgegrauten Klasse :) in der Datei entspricht . Diese. Wir sagten, machen Sie weiter, ich werde deserialisieren. Das können Sie. Ihre Versionen sind die gleichen: serialVersionUID8129437039424566964static final long serialVersionUIDserialVersionUID
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;    // +
}
Wir starten ... Und ... Alles funktioniert. Soweit ich weiß, hätte dieser Fehler vermieden werden können, wenn die Klasse im Voraus Folgendes deklariert hätte:
public class SerializableClass implements Serializable {
    static final long serialVersionUID = 1L;

    private String name;
    private int number;
}
Diese. Wir lassen Java nicht seine eigenen Berechnungen serialVersionUIDauf der Grundlage seiner Algorithmen durchführen (ziemlich komplexe Algorithmen). Wenn sich nun eine Klasse ändert, serialVersionUID = 1L überprüfen wir Folgendes:
public static void main(String[] args) throws IOException, ClassNotFoundException {
    SerializableClass serializableClass = new SerializableClass();

    serialize(serializableClass);

    SerializableClass newObject = (SerializableClass) deserialize();
}
Es funktioniert. Und jetzt so:
public class SerializableClass implements Serializable {
    static final long serialVersionUID = 1L;

    //private String name;
    //private int number;
}
Ja.. Und so?
public class SerializableClass implements Serializable {
    static final long serialVersionUID = 1L;
    public int A;
    protected String value;
    //private String name;
    //private int number;
}
Cool.. alles funktioniert weiterhin. Also habe ich meinen ersten Artikel fertiggestellt. Ich wollte das alles in die Kommentare schreiben, kam aber mit den Symbolen nicht klar. Ich akzeptiere nüchterne Kritik und Kommentare. PS Danke an den Autor, der mich zu diesen Köstlichkeiten inspiriert hat. Wahrscheinlich lernen sie so :) Viel Glück an alle :)
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION