1. 什么是反序列化?
反序列化是指从序列化状态重新构建对象的过程,是序列化的反操作。
2. Serializable接口与Externalizable接口的区别?
Serializable是一个标识接口,而Externalizable是一个非标识接口。当用Serializable接口时,实现类会自动序列化,但可以通过重写writeObject()方法和readObject()方法来实现更多复杂的对象序列化过程。
当用Externalizable接口时,你会对序列化过程有一个完全的控制。
3. 什么是Externalizable接口?
Externaizable接口用于将对象状态转换为压缩格式的字节流,它不是一个标识接口。
4. Serializable接口有多少方法?如果没有,Serializable接口的目的是什么?
Serializable接口存在于java.io包中,是序列化机制的核心。Serializable接口没有方法,是一个标识接口。当一个类实现Serializable接口,那么这个类就可以序列化了,编译器通过这个Serializable接口标识,告诉Java序列化机制序列化这个类的对象。
5. 什么是序列化?
Serializable是一个标识接口,当一个对象通过网络传输(比如rmi或ejb),或者保存一个对象状态为文件,这个对象的类就需要实现Serializable接口。实现了Serializable接口,这个类的对象就可以转换为字节流,通过网络传输。
6. 除了Serializable接口,还有什么方法可以实现对象序列化?
除了Serializable接口,至少还有三种方法可以实现Java对象序列化。
对于对象序列化,开发者可以实现Externalizable接口(扩展自Serializable接口)。实现Externalizable接口,开发者需要实现writeExternal()方法和readExternal()方法,因此这种方法对序列化对象有更多的读写控制。
XML序列化是一种常用的数据交换方法。这种方法相比Java序列化,无论对象大小还是处理时间,都有较差性能。用一个比较快的XML解析器,可能会减少处理时间差距。无论怎么说,XML序列化对于序列化对象的改变,提供了一种更有扩展性的解决方法
最后考虑一个自己定制的序列化方法,你自己将对象内容写成ObjectOutputStream或DataOutputStream。因这种方法更接近序列化的底层实现,它提供最大的灵活性和扩展性,而且性能比Java序列化还要好。
7. 什么是transient变量?在序列化过程起什么作用?
transient关键字用于标识一个属性不需要序列化,当反序列化的时候,transient变量仍然是默认值。把不需要序列化的属性设置为transient,可以提高序列化的性能。
class MyVideo implements Serializable {
private Video video;
private transient Image thumbnailVideo;
private void generateThumbnail() {
// generate thumbnail.
}
private void readObject(ObjectInputStream inputStream) throws IOException, ClassNotFoundException {
inputStream.readObject();
generateThumbnail();
}
}
8. 序列化的作用是什么?
序列化被用于:
通过网络传输一个或多个对象的状态;
保存对象状态到一个文件中;
一个对象的状态需要作为字节流操作时。
9. 静态变量会被序列化吗?
不。静态变量属于类而不属于一个对象,静态变量不是对象状态的一部分,因此静态变量不做为序列化对象的一部分而被序列化。
10. 为什么序列化不保存静态类属性?为什么不序列化静态变量?
静态变量不属于对象状态的一部分,它们被同一个类的所有对象共享。保存静态变量序列化会有如下问题:
同一个对象会有多个不同的副本,影响效率;
静态变量可以被任何对象修改,因此一个序列化副本可能与当前静态变量值不同步。