您的位置:首页 > 编程语言 > Java开发

JAVA学习笔记-序列化

2017-09-16 19:33 351 查看
  1.对象序列化和反序列化

对象序列化是指将java对象转化为字节序列的过程,而反序列化是指将字节序列还原回java对象的过程。

java对象的生命周期 -- 只有在JVM运行期间对象才会存在,而序列化过程是为了将对象持久化(保存到硬盘上)。序列化保存的是对象的状态,即成员变量,不关注静态变量。

  2.实体对象为什么要实现序列化接口?

Serializable是一个标识化接口,实现了Serializable接口的实体类才能序列化。

在ObjectOutputStream的writeObject0中有这样一串代码

private void writeObject0(Object obj, boolean unshared)
if (obj instanceof String) {
                writeString((String) obj, unshared);
            } else if (cl.isArray()) {
                writeArray(obj, desc, unshared);
            } else if (obj instanceof Enum) {
                writeEnum((Enum<?>) obj, desc, unshared);
            } else if (obj instanceof Serializable) {
                writeOrdinaryObject(obj, desc, unshared);
            } else {
                if (extendedDebugInfo) {
                    throw new NotSerializableException(
                        cl.getName() + "\n" + debugInfoStack.toString());
                } else {
                    throw new NotSerializableException(cl.getName());
                }
            }
如果不是String,Enum或者数组,那么该对象必须要实现Serializable接口,不然会抛出NotSerilizableException异常

  3.实体对象中为什么要添加序列化id?

 当实现java.io.Serializable接口的实体(类)没有显式地定义一个名为serialVersionUID,类型为long的变量时,Java序列化机制会根据编译的class自动生成一个serialVersionUID作序列化版本比较用,这种情况下,只有同一次编译生成的class才会生成相同的serialVersionUID 。在反序列化时,系统会去检验这个ID,如果相同则表示为同一版本,不同则会报出异常。

  4.对象的序列化是安全的吗?

  不是安全的。序列化以二进制文档写入硬盘,这一行为完全可以。甚至可以通过二进制输出流查看其明文内容,甚至private的字段。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: