参考地址:http://www.verydemo.com/demo_c89_i125045.html
1.什么是序列化?
简单的说就是为了保存各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象再读出来的过程。对象序列化就是把对象写入到输出流中,用来存储或传输。
2.序列化都保存了些什么?
a.对象的类型。
b.对象属性的类型。
c.对象属性的值。
3.什么情况下需要序列化?
a.当你想把对象的状态保存到一个文件中或者数据库中的时候。
b.当你想用套接字在网络上传输对象的时候。
c.当你想通过RMI传输对象的时候。
4.举例说明
Java代码:
***************************************************
package com.gyb.serializable;
import java.io.Serializable;
public class DomainObject implements Serializable {
public String name;
public int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String toString() {
return "This is a serializable test!";
}
}
****************************************************
package com.gyb.serializable;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class WriteObjectTestDemo {
public static void main(String args[]) {
FileOutputStream fos = null;
ObjectOutputStream oos = null;
try {
DomainObject obj = new DomainObject();
obj.setName("gyb");
obj.setAge(24);
fos = new FileOutputStream("d:/temp");
oos = new ObjectOutputStream(fos);
oos.writeObject(obj);
oos.close();
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
**********************************************
package com.gyb.serializable;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
public class ReadObjectTestDemo {
public static void main(String args[]) {
FileInputStream fis = null;
ObjectInputStream ois = null;
try {
fis = new FileInputStream("d:/temp");
ois = new ObjectInputStream(fis);
DomainObject obj = (DomainObject) ois.readObject();
System.out.println("name = " + obj.getName());
System.out.println("age = " + obj.getAge());
ois.close();
fis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
************************************************
结果会在D盘下生成一个temp对象文件,用一个支持二进制的编辑器工具打开后内容如下:
com.gyb.serializable.DomainObject
ageL
namet
Ljava/lang/String;xp
gyb
我们可以用对象反序列化从输入流中读出这个对象,ReadObjectTestDemo 类的执行结果为:
name = gyb
age = 24
5.注意事项
a.序列化时只对对象的状态进行保存,而不管对象的方法。
b.当一个父类实现序列化,子类自动实现序列化,不需要再显式实现Serializable接口。
c.当一个对象的实例变量引用了其它对象,序列化该对象时其它引用对象也被进行了序列化。
....................................................................
1.安全方面的原因:比如一个对象拥有private,public等属性,若对这个对象进行写入文件或者rmi传输,在序列化进行传输的的过程中,这个对象的private属性是不受保护的。
2.资源分配方面的原因:比如socket,thread,如果可以序列化,进行传输或者保存,也无法对他们进行重新的资源分配,而且也没有必要这样去实现。