目录
1.1、对象序列化的概念
所谓的对象序列化指的是可以将在内存之中保存的对象数据(对象里面包含属性),进行二进制数据传输的一种操作,而如果要想完成这样的二进制操作,那么对象所在的类就必须实现java.io.Serializable接口。这个接口和Cloneable接口道理一样,都属于一种标识接口,表示一种能力。
范例:定义可以被序列化的类
@SuppressWarnings("serial")
class Person implements Serializable{
private String name ;
private int age ;
public Person(String name,int age) {
this.name = name ;
this.age = age ;
}
@Override
public String toString() {
return "姓名:" + this.name + ",年龄:" + this.age;
}
}
以后Person类的对象(主要是里面的属性)就可以进行二进制数据的传输了。
1.2、实现序列化和反序列化
如果要想进行对象的序列化和反序列化的手工操作,在Java之中提供了两个操作类:ObjectOutputStream、ObjectInputStream,而这两个类的继承结构、构造方法、操作方法定义如下:
| ObjectOutputStream: | ObjectInputStream: |
| java.lang.Object |- java.io.OutputStream |- java.io.ObjectOutputStream | java.lang.Object |- java.io.InputStream |- java.io.ObjectInputStream |
| public ObjectOutputStream(OutputStream out) throws IOException | public ObjectInputStream(InputStream in) throws IOException |
| public final void writeObject(Object obj) throws IOException | public final Object readObject() throws IOException, ClassNotFoundException |
范例:实现的序列化操作
public class TestDemo {
public static void main(String[] args) throws Exception {
Person per = new Person("张三", 20);
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(
new File("D:" + File.separator + "person.ser")));
oos.writeObject(per); // 输出对象
oos.close();
}
}
范例:执行反序列化操作
public class TestDemo {
public static void main(String[] args) throws Exception {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(
new File("D:" + File.separator + "person.ser")));
Person per = (Person) ois.readObject(); // 接收对象
ois.close();
System.out.println(per);
}
}
1.3、transient关键字
默认的情况下,当一个类的对象被序列化的时候,这个类之中的所有属性都被保存下来,如果现在某些属性不希望被保存的话,那么可以使用transient进行声明。
范例:观察transient定义
private transient String name; // 不能被序列化
private int age; // 可以被序列化
面试题:请解释Java序列化的作用以及实现?
序列化操作的主要目的是为保证对象可以以二进制数据的方式进行传输,如果要想实现对象序列化,对象所在的类必须实现java.io.Serializable接口,默认情况下一个对象的所有属性都会被序列化下来,也可以使用transient关键字定义不被序列化的属性。
1万+



被折叠的 条评论
为什么被折叠?



