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