如果父类实现了Serializable并生成了serialVersionUID,而子类并没有写重新生成serialVersionUID的语句?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果父类实现了Serializable并生成了serialVersionUID,而子类并没有写重新生成serialVersionUID的语句?相关的知识,希望对你有一定的参考价值。

那么反序列化时会报错吗?

父类实现了 Serializable 后,字类不需要显式实现 Serializable,但是仍然需要定义 serialVersionUID。
serialVersionUID 是序列化版本ID,反序列化的时候通过它的值来验证版本是否一致。如果不指明,会根据类的方法属性等信息自动计算出来。
也就是说,序列化之后,如果你没有对子类进行修改,那么是可以正常反序列化的。如果你修改了子类,那么系统自动算出来的 serialVersionUID 就可能发生改变,版本不一致,这时候就不能反序列化了。
手动定义 serialVersionUID 的作用是可以手动控制版本。当你对类进行了修改,自行判断是否和之前兼容,来决定 serialVersionUID 是否修改。
参考技术A android-added: Notes about serialVersionUID, using serialization judiciously, JSON.
Serializability of a class is enabled by the class implementing the
* java.io.Serializable interface. Classes that do not implement this
* interface will not have any of their state serialized or
* deserialized. All subtypes of a serializable class are themselves
* serializable. The serialization interface has no methods or fields
* and serves only to identify the semantics of being serializable. <p>

翻译:实现Serializable 接口就能序列化。实现serializable的类的子类也是serializable的。
这个序列化接口没有方法或者fields,只是语法标记为可以序列化
上面说如果父类是序列化的,则子类也是序列化的,我们来做一个测试
父类
public class BaseBean implements Serializable
public static final int serialVersionUID = 1;
public String property1;
public String property2;

子类
public class TestBean extends BaseBean
public String desc;
@Override
public String toString()
return "TestBean" +
"desc='" + desc + '\'' +
", property1='" + property1 + '\'' +
", property2='" + property2 + '\'' +
'';


测试
public void serialization(View view)
try

TestBean testBean = new TestBean();
testBean.property1 = "属性22882288";
testBean.property2 = "属性6666";
testBean.desc = "我是testbean";

ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("/sdcard/aaatest.txt"));
objectOutputStream.writeObject(testBean);
catch (IOException e)
e.printStackTrace();



public void deserialization(View view)
ObjectInputStream objectInputStream = null;
try
objectInputStream = new ObjectInputStream(new FileInputStream("/sdcard/aaatest.txt"));
TestBean testBean = (TestBean) objectInputStream.readObject();
Log.i(TAG,"deserialization"+testBean.toString());
catch (Exception e)
e.printStackTrace();


实测下来,可以正常序列化和反序列化,没有问题

以上是关于如果父类实现了Serializable并生成了serialVersionUID,而子类并没有写重新生成serialVersionUID的语句?的主要内容,如果未能解决你的问题,请参考以下文章

为啥要实现Serializable

Serializable java序列化

Intellij IDEA生成serialVersionUID

Java Serializable Objects(序列化)

关于java的序列化

java中的Serializable啥用 举例