JAVA 序列化 和 反序列化 (Externalizable Serializable) 那些事
来源:互联网 发布:28周四维彩超标准数据 编辑:程序博客网 时间:2024/05/22 09:02
序列化控制
当我们对序列化进行控制时,可能某个特定子对象不想让Java序列化机制自动保存与恢复。如果子对象表示的是我们不希望将其序列化的敏感信息(如密码),通常会面临这种情况。即使对象中的这些信息是private属性,一经序列化处理,人们就可以通过读取文件或者拦截网络传输的方式来访问到它。有两种办法可以防止对象的敏感部分被序列化:
- 实现
Externalizable
代替实现Serializable
接口来对序列化过程进行控制,Externalizable
继承了Serializable
接口,同时增添了两个方法:writeExternal()
和readExternal()
。
两者在反序列化时的区别:
- 对Serializable对象反序列化时,由于Serializable对象完全以它存储的二进制位为基础来构造,因此并不会调用任何构造函数,因此Serializable类无需默认构造函数,但是当Serializable类的父类没有实现Serializable接口时,反序列化过程会调用父类的默认构造函数,因此该父类必需有默认构造函数,否则会抛异常。
- 对Externalizable对象反序列化时,会先调用类的不带参数的构造方法,这是有别于默认反序列方式的。如果把类的不带参数的构造方法删除,或者把该构造方法的访问权限设置为private、默认或protected级别,会抛出java.io.InvalidException: no valid constructor
异常,因此Externalizable对象必须有默认构造函数,而且必需是public的。
-Externalizable
的替代方法:如果不是特别坚持实现Externalizable接口,那么还有另一种方法。我们可以实现Serializable
接口,并添加writeObject()
和readObject()
的方法。一旦对象被序列化或者重新装配,就会分别调用那两个方法。也就是说,只要提供了这两个方法,就会优先使用它们,而不考虑默认的序列化机制。这些方法必须含有下列准确的签名:
private void writeObject(ObjectOutputStream stream) throws IOException;private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException
- 可以用transient
关键字逐个字段地关闭序列化,它的意思是“不用麻烦你保存或恢复数据—我自己会处理的”。由于Externalizable对象在默认情况下不保存它们的任何字段,所以transient关键字只能和Serializable对象一起使用。- 实现
- JAVA 序列化 和 反序列化 (Externalizable Serializable) 那些事
- java Serializable和Externalizable序列化反序列化详解
- java Serializable和Externalizable序列化反序列化详解
- java Serializable和Externalizable序列化反序列化详解
- Java之Serializable/Externalizable序列化和反序列化
- Java序列化与反序列化(Serializable&&Externalizable)
- Serializable和Externalizable序列化反序列化
- 对象序列化与反序列化(Serializable、Externalizable )
- java Serializable和Externalizable序列化反序列化详解--转
- JAVA序列化基础知识Serializable与Externalizable的区别(改变默认的序列化/反序列化行为)
- Java序列化Serializable和Externalizable
- Java序列化Serializable和Externalizable
- java序列化之Serializable和Externalizable
- Java序列化Serializable和Externalizable
- 序列化:Serializable和Externalizable
- 序列化Serializable和Externalizable
- java Serializable 序列化 反序列化
- java序列化(Serializable)的作用和反序列化
- 在子线程中如何使用Handler将一个包含对象的集合传递给主线程
- android application 属性详解
- 文章标题
- bzoj 3224 普通平衡树
- opencv2.4.11在VS2013中的配置(使用配置文件的方式)
- JAVA 序列化 和 反序列化 (Externalizable Serializable) 那些事
- Android客户端与服务器通信方式浅谈
- TableView滑动不加载
- Effective C++(条款35-38)
- linux fedora c sqlite3
- 用linux vconfig配置neutron VLAN试验
- 不看星座和属相,从你喜欢的编程语言看你是什么人
- 浅谈Android控件中的ListView优化
- mac上编译thrift 0.8.0