gpt4 book ai didi

java - 抽象类是否应该有一个 serialVersionUID

转载 作者:IT老高 更新时间:2023-10-28 13:53:47 28 4
gpt4 key购买 nike

在java中,如果一个类实现了Serializable但是是抽象的,它应该有一个serialVersionUID long声明,还是子类只需要这个?

在这种情况下,确实是所有子类都处理序列化,因为类型的目的是在 RMI 调用中使用。

最佳答案

serialVersionUID 用于确定反序列化对象与类的当前版本之间的兼容性。 因此,在类的第一个版本中,或者在这种情况下,在抽象基类中,它并不是真正需要的。您永远不会有该抽象类的实例来序列化/反序列化,因此它不需要 serialVersionUID。

(当然,它确实会生成一个编译器警告,你想摆脱它,对吧?)

事实证明,詹姆斯的评论是正确的。抽象基类的serialVersionUID确实会传播到子类。鉴于此,您确实需要在您的基类中使用 serialVersionUID。

要测试的代码:

import java.io.Serializable;

public abstract class Base implements Serializable {

private int x = 0;
private int y = 0;

private static final long serialVersionUID = 1L;

public String toString()
{
return "Base X: " + x + ", Base Y: " + y;
}
}



import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class Sub extends Base {

private int z = 0;

private static final long serialVersionUID = 1000L;

public String toString()
{
return super.toString() + ", Sub Z: " + z;
}

public static void main(String[] args)
{
Sub s1 = new Sub();
System.out.println( s1.toString() );

// Serialize the object and save it to a file
try {
FileOutputStream fout = new FileOutputStream("object.dat");
ObjectOutputStream oos = new ObjectOutputStream(fout);
oos.writeObject( s1 );
oos.close();
} catch (Exception e) {
e.printStackTrace();
}

Sub s2 = null;
// Load the file and deserialize the object
try {
FileInputStream fin = new FileInputStream("object.dat");
ObjectInputStream ois = new ObjectInputStream(fin);
s2 = (Sub) ois.readObject();
ois.close();
} catch (Exception e) {
e.printStackTrace();
}

System.out.println( s2.toString() );
}
}

在 Sub 中运行一次 main 以使其创建和保存对象。然后更改 Base 类中的 serialVersionUID,注释掉 main 中保存对象的行(因此它不会再次保存它,您只想加载旧的),然后再次运行它。这将导致异常

java.io.InvalidClassException: Base; local class incompatible: stream classdesc serialVersionUID = 1, local class serialVersionUID = 2

关于java - 抽象类是否应该有一个 serialVersionUID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/893259/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com