所以..我们有一个类,我们想使用常规方法序列化(我们使用
Serializable
)
package Serialization;
import java.io.Serializable;
public class SerializableClass implements Serializable {
private String name;
private int number;
}
我们正在编写一个测试应用程序。我会立即说我的目标是展示什么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();
}
}
一切都很好。该类被序列化到一个文件中FILE_NAME = "c:\\File.dat"
。天快黑了...:) 忘记向类中添加字段。添加:
public class SerializableClass implements Serializable {
private String name;
private int number;
private String FirstName; // +
private String LastName; // +
}
一切似乎都很好..一切都编译了..所以我们运行它,从文件“ ”main
反序列化该类: SerializableClass
c:\\File.dat
public static void main(String[] args) throws IOException, ClassNotFoundException {
SerializableClass newObject = (SerializableClass) deserialize();
}
哎呀……怎么办呢……
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)
总的来说,一切都是公平的。该类已更改,其 serialVersionUID
= -8271479231760195917
,并在文件serialVersionUID
=中序列化8129437039424566964
。现在该怎么办,该怎么办?如何创建实例?有一个出口。我们需要在我们的类中声明: static final long serialVersionUID
,它等于serialVersionUID
文件中灰显的:)类。那些。我们说,继续,我会反序列化.. 你可以.. 你的版本是相同的:
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; // +
}
我们启动...并且...一切正常。据我了解,如果该类提前声明,则可以避免此错误:
public class SerializableClass implements Serializable {
static final long serialVersionUID = 1L;
private String name;
private int number;
}
那些。我们不让JavaserialVersionUID
根据其算法(相当复杂的算法)进行自己的计算。现在,每当类发生变化时,我们serialVersionUID = 1L
都会检查:
public static void main(String[] args) throws IOException, ClassNotFoundException {
SerializableClass serializableClass = new SerializableClass();
serialize(serializableClass);
SerializableClass newObject = (SerializableClass) deserialize();
}
它有效..现在像这样:
public class SerializableClass implements Serializable {
static final long serialVersionUID = 1L;
//private String name;
//private int number;
}
是的..所以呢?
public class SerializableClass implements Serializable {
static final long serialVersionUID = 1L;
public int A;
protected String value;
//private String name;
//private int number;
}
酷..一切都继续进行。这样我就完成了我的第一篇文章。我想把这些都写在评论里,但我无法通过符号。我会接受清醒的批评和评论 PS 感谢启发我做这些快乐的作者。可能,这就是他们学习的方式:)祝大家好运:)
GO TO FULL VERSION