1、对象的序列化、反序列化
1)对象序列化,就是将Object转换成byte序列,反之叫对象的反序列化
2)序列化流(ObjectOutputStream),是过滤流------>writeObject
反序列化流(ObjectInputStream) ----->readObject
3)序列化接口(Serializable)
对象必须实现序列化接口,才能进行序列化,否则将出现异常
这个接口,没有任何方法,只有一个标准
ObjectOutputStream
public ObjectOutputStream(OutputStream out) throws IOException
- 创建写入指定 OutputStream 的 ObjectOutputStream。此构造方法将序列化流部分写入底层流;调用者可以 通过立即刷新流,确保在读取头部时,用于接收 ObjectInputStreams 构造方法不会阻塞。
-
-
-
public final void writeObject(Object obj) throws IOException
- 将指定的对象写入 ObjectOutputStream。对象的类、类的签名,以及类及其所有超类型的非瞬态和非静态字段的值都将被写入。可以使用 writeObject 和 readObject 方法重写类的默认序列化。由此对象引用的对象是以可变迁的方式写入的,这样,可以通过 ObjectInputStream 重新构造这些对象的完全等价的图形。
-
ObjectInputStream
public ObjectInputStream(InputStream in) throws IOException
- 创建从指定 InputStream 读取的 ObjectInputStream。从流读取序列化头部并予以验证。在对应的 ObjectOutputStream 写入并刷新头部之前,此构造方法将阻塞。
-
-
public final Object readObject() throws IOException, ClassNotFoundException
- 从 ObjectInputStream 读取对象。对象的类、类的签名和类及所有其超类型的非瞬态和非静态字段的值都将被读取。可以使用 writeObject 和 readObject 方法为类重写默认的反序列化。由此对象引用的对象是可传递读取的,这样 readObject 即可重新构造这些对象的完全等价的图形。
-
- 4)transient关键字修饰不能被jvm序列化和反序列化,
-
但可以自己完成这个元素的序列化
-
-
private void writeObject(java.io.ObjectOutputStream s)
-
<pre name="code" class="java">private void readObject(java.io.ObjectInputStream s)
-
-
private transient int stuage //该元素不会进行jvm默认的序列化,也可以自己完成这个元素的序列化
-
private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException{ s.defaultWriteObject();//把jvm能默认序列化的元素进行序列化操作 s.writeInt(stuage);//自己完成stuage的序列化 } private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException{ s.defaultReadObject();//把jvm能默认反序列化的元素进行反序列化操作 this.stuage = s.readInt();//自己完成stuage的反序列化操作 }
-
- 4) 一个类实现了序列化接口,那么其子类都可以进行序列化
-
对子类对象进行反序列化操作时::如果其父类没有实现序列化接口,那么其父类的构造函数会被调用 -
-
-
-
-
-