一 点睛
在默认情况下,当一个类对象序列化时,会将这个类之中的全部属性都保存下来,如果不希望类中的某个属性被序列化(或某些属性不希望被保存),则可以在声明属性之前加上transient关键字。
二 实战
1 准备Person类
import java.io.Serializable;
public class Person implements Serializable
{ // 此类的对象可以被序列化
public static final long serialVersionUID = 42L;
private String name; // 声明name属性,将改属性变成包属性
transient private int age; // 声明age属性
String country = "cn";
public Person(String name, int age ,String country)
{ // 通过构造方法设置属性内容
this.name = name;
this.age = age;
this.country = country;
}
public String toString()
{ // 覆写toString()方法
return "姓名:" + this.name + ";年龄:"
+ this.age + ";国籍:" + this.country;
}
}
2 准备序列化类
import java.io.File;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
public class SerDemo01
{
public static void main(String[] args) throws Exception
{
File f = new File("SerTest.txt");
ObjectOutputStream oos = null;
OutputStream out = new FileOutputStream(f); // 文件输出流
oos = new ObjectOutputStream(out); // 为对象输出流实例化
oos.writeObject(new Person("Tom", 25, "America")); // 保存对象到文件
oos.close(); // 关闭输出
}
}
3 准备反序列化类
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.ObjectInputStream;
public class SerDemo02
{
public static void main(String[] args) throws Exception
{
File f = new File("SerTest.txt");
ObjectInputStream ois = null;
InputStream input = new FileInputStream(f); // 文件输入流
ois = new ObjectInputStream(input); // 为对象输出流实例化
Object obj = ois.readObject(); // 读取对象
ois.close(); // 关闭输出
System.out.println(obj);
}
}
4 编译运行序列化和反序列化
E:\Java\Java编程技术大全\范例源码、实战练习答案、赠送资源\范例源码\chap17\范例17-3>javac Person.java
E:\Java\Java编程技术大全\范例源码、实战练习答案、赠送资源\范例源码\chap17\范例17-3>javac SerDemo01.java
E:\Java\Java编程技术大全\范例源码、实战练习答案、赠送资源\范例源码\chap17\范例17-3>javac SerDemo02.java
E:\Java\Java编程技术大全\范例源码、实战练习答案、赠送资源\范例源码\chap17\范例17-3>java SerDemo01
E:\Java\Java编程技术大全\范例源码、实战练习答案、赠送资源\范例源码\chap17\范例17-3>java SerDemo02
姓名:Tom;年龄:0;国籍:America
5 说明
从输出结果可以看到,Person类中的age并没有被保存下来,输出这个属性时,输出的是0,如果是String类型,默认会输出null