简析Java序列化

Java序列化是指把对象和关于对象的元数据(比如类名和属性名称)转换为二进制序列。去序列化则是指将这种二进制序列重新解析成对象。

要实现序列化的对象必须实现java.io.Serializable这个接口。这个接口没有方法或者变量,所以实现它的类也不需要具体地实现任何方法或者定义任何变量。它只是一个用于标识可序列化的接口。

举个例子,序列化对象用到ObjectOutputStream类,它在原有流(比如文件输出流或者套接字流)上调用writeObject()方法,使对象序列化为流并写入。这也说明了对象流是一个处理流。

File file = new File(filename);
// 先打开一个文件输出字节流,然后在字节流上套一个对象输出流
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(file));
out.writeObject(instanceYouWantToSerialize);

去序列化则相反,用到ObjectInputStream类。

File file = new File(filename);
// 先打开一个文件输入字节流,然后在字节流上套一个对象输入流
ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
// 注意去序列化的时候要强制转换类型
ClassOfInstance instance = (ClassOfInstance)in.readObject();

为了防止序列化出现的修改偏差,可以显式地控制类中的serialVersionUID这个变量,声明时将它声明为private static final long类型。如果你进行了修改,应该将这个值改变。如果强行兼容,可以不改变。而新的成员变量会被设为默认值(应该是)。

一般来说,序列化是由Java直接替我们完成的,序列化过程的细节对于我们来说是透明的。然而,如果想要控制序列化过程也是可以的,只需要通过实现externalizable即可,它是serializable的子接口,实现了它即可控制序列化过程如何进行的细节,自己定制需要的序列化。

transient是用来标定透明的关键字,标定了一个类成员是透明的。那么在序列化的时候,这个成员就不予考虑,当然,在去序列化的时候,这个成员就会被恢复为默认值。

Java序列化时如果遇到无法序列化的属性(比如这个属性的类型是一个无法实例化的类),那么将会抛出一个NotSerializableException。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值