JavaRush /Blog Java /Random-MS /Sebagai tindak balas kepada artikel "Mengapa menggunakan ...
Сергей
Tahap
Киев

Sebagai tindak balas kepada artikel "Mengapa menggunakan SerialVersionUID di dalam kelas Serializable di Java"

Diterbitkan dalam kumpulan
Jadi.. Kami mempunyai kelas yang ingin kami sirikan menggunakan kaedah konvensional (kami gunakan Serializable) Sebagai tindak balas kepada artikel "Mengapa menggunakan SerialVersionUID di dalam kelas Serializable di Java" - 1
package Serialization;

import java.io.Serializable;

public class SerializableClass implements Serializable {
    private String name;
    private int number;
 }
Kami sedang menulis permohonan ujian. Saya akan katakan dengan segera bahawa matlamat saya adalah untuk menunjukkan apa 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();
    }
}
Semuanya berfungsi dengan baik. Kelas disirikan kepada fail FILE_NAME = "c:\\File.dat". Hari dah gelap... :) Terlupa nak tambah medan pada kelas. Tambah:
public class SerializableClass implements Serializable {
    private String name;
    private int number;
    private String FirstName;   // +
    private String LastName;    // +
 }
Segala-galanya nampaknya baik-baik saja.. semuanya disusun.. Jadi kami menjalankannya main, nyahserialisasi kelas SerializableClassdaripada fail " c:\\File.dat":
public static void main(String[] args) throws IOException, ClassNotFoundException {
    SerializableClass newObject = (SerializableClass) deserialize();
}
Oh... Apa yang perlu dilakukan...
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)
Secara umum, semuanya adil. Kelas telah berubah dan serialVersionUID= -8271479231760195917, dan bersiri dalam fail serialVersionUID= 8129437039424566964. Apa yang perlu dilakukan sekarang, apa yang perlu dilakukan? Bagaimana untuk membuat contoh? Ada jalan keluar. Kami perlu mengisytiharkan dalam kelas kami: static final long serialVersionUID, yang sama dengan serialVersionUIDkelas yang dikelabukan :) dalam fail. Itu. kami berkata, teruskan, saya akan deserialize.. anda boleh.. versi anda adalah sama:
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;    // +
}
Kami melancarkan... Dan.. Semuanya berfungsi. Seperti yang saya faham, ralat ini boleh dielakkan jika kelas telah mengisytiharkan terlebih dahulu:
public class SerializableClass implements Serializable {
    static final long serialVersionUID = 1L;

    private String name;
    private int number;
}
Itu. kami tidak membenarkan Java melakukan pengiraan sendiri serialVersionUIDberdasarkan algoritmanya (algoritma yang agak kompleks). Sekarang, apabila kelas berubah, kami serialVersionUID = 1L menyemak:
public static void main(String[] args) throws IOException, ClassNotFoundException {
    SerializableClass serializableClass = new SerializableClass();

    serialize(serializableClass);

    SerializableClass newObject = (SerializableClass) deserialize();
}
Ia berfungsi.. Dan sekarang seperti ini:
public class SerializableClass implements Serializable {
    static final long serialVersionUID = 1L;

    //private String name;
    //private int number;
}
Ya.. Dan begitu?
public class SerializableClass implements Serializable {
    static final long serialVersionUID = 1L;
    public int A;
    protected String value;
    //private String name;
    //private int number;
}
Sejuk.. semuanya terus berfungsi. Jadi saya selesaikan artikel pertama saya. Saya mahu meletakkan semua ini dalam komen, tetapi saya tidak dapat melalui simbol. Saya akan menerima kritikan dan komen yang serius PS Terima kasih kepada penulis yang memberi inspirasi kepada saya untuk melakukan keseronokan ini.. Mungkin, ini adalah cara mereka belajar :) Semoga berjaya kepada semua orang :)
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION