[英]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.