繁体   English   中英

我应该在接口上实现`serialVersionUID`吗?

[英]Should I implement `serialVersionUID` on interfaces?

在创建扩展Serializable的接口时 ,我应该添加serialVersionUID字段吗?

我的IDE(Netbeans 8.2)抱怨该字段丢失。 但是,根据我的理解, serialVersionUID仅适用于非抽象类(将在反序列化期间实例化的特定类)。

如果需要 serialVersionUID ,我该怎么做才能扩展接口的接口? 通常,此类字段在类heirarchy中的每个类中声明。 虽然这也适用于接口,但它会导致不同的IDE警告,即字段隐藏字段。

不,你不应该。 在序列化或反序列化过程中,无法考虑接口的serialVersionUID 这毫无意义。 serialVersionUID适用于Serializable 类。

对我来说,扩展Serializable的接口是一个问题,你强迫所有实现你的接口的人都是Serializable ,他们可能根本就不想这样做。 另一方面,我可以考虑这种情况有意义的情况,例如Entities的通用接口(读取@Entity )必须具有ID并且同时必须是Serializable

我苦苦寻找这个文件,但我的测试表明,如果您序列化类, 即使你改变serialVersionUID接口的事后 ,然后反序列化-类它将反序列化完美的罚款。 所以,说你有这个:

static interface ITest extends Serializable {
    public final long serialVersionUID = 123L;
}

static class TestImpl implements ITest {
    private static final long serialVersionUID = 456L;
}

你首先序列化一些实例:

ObjectOutputStream oos = new ObjectOutputStream(
         new FileOutputStream(new File("/Your/Path/Here/o.ser")));
oos.writeObject(new TestImpl());

然后将接口的serialVersionUID更改为其他值: public final long serialVersionUID = 789; ,编译,以便生成一个新的.class文件并反序列化它:

ObjectInputStream in = new ObjectInputStream(
         new FileInputStream("/Your/Path/Here/o.ser"));
TestImpl c = (TestImpl) in.readObject();

这意味着在这种情况下,如果您在界面中定义一个并不重要。

只会重要,如果你想序列化类接口本身的一个实例:

Class<ITest> c = ITest.class;
// serialize c

在这种情况下,更改serialVersionUID会很重要,它会破坏java.io.InvalidClassException序列化

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM