对于对象的序列化可能很多初学者不熟悉,希望通过这篇文章你对对象的序列化有一个大概的了解。
对象序列化指的是将对象转换为字节流保存起来,并在日后还原这个对象。
可能我们认为这个有什么用处啊。这个可以将我们的对象保存在存储设备上,并且可以永久的保存。另外我们有时候需要在网络上传输一个对象,这个也是将对象序列化之后通过网络发送出去,然后再通过反序列化,还原成为原来的对象。
一个对象要想能够实现序列化,必须实现Serializable接口或Externalizable接口。
Serializable我们可以通过查看Java API发现这个接口没有任何方法,所以这个接口就是一个标识接口,实现这个接口就是为了告诉jvm这个类的对象可以序列化。
我们可以利用Java给我们提供ObjectOutputStream和ObjectInputStream这两个类实现对象的序列化和反序列化。下面看一个例子:
//aaaa:25:3000.5
bbbb:24:3200.4
上面的程序中我们定义了一个带参数的方法,那么我们就会想在对象反序列化的时候,会去调用构造方法,构建对象吗?答案是不会去调用对象的构造方法,而是根据序列化的数据直接生成对象。
不是对象的所有的东西都可以序列化的。
当一个对象被序列化时,只保存对象的非静态成员变量,不能保存任何的成员方法和静态的成员变量。如果一个对象的成员变量是一个对象,那么这个对象的数据成员也会被保存。如果一个可序列化的对象包含对某个不可序列化的对象的引用,那么整个序列化操作将会失败,并且会抛出一个NotSerializableException.我们可以将这个引用标记为transient,那么对象仍然可以序列化。
我们仔细看刚才的代码我们在我们创建的线程前面加上了transient说明线程对象是不序列化的。
有时候我们需要对一些数据进行加密然后再序列化,然后反序列化的时候在调用相应的方法解密,这时候我们可以调用两个方法writeObject和readObject.这两个方法可以按照我们的自己需要的方法和顺序,去序列化对象,然后再反序列化。下面的例子是修改了上面的例子中的一点东西,看完了你就知道这两个方法怎么用了:
//Write Object
Write Object
Read Object
aaaa:25:0.0
Read Object
bbbb:24:0.0从结果中我们可以看出在我们序列化和反序列化的时候调用了我们自己写的方法。
如果哪里错误,还请指出。
TAG: JavaJAVAjava
点击下载系统:
http://www.myeducs.cn/chaxun/index.html?go=JavaIO 6—对象的序列化&aa=%CB%D1%CB%F7%C2%DB%CE%C4