我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这个类实现了Serilizable接口,这个的所有属性和方法都会自动序列化。
然而在实际开发过程中,我们常常会遇到这样的问题,这个类的有些属性需要序列化,而其他属性不需要被序列化,诚然,你可以让这个类来实现Externalizable接口,这个接口是Serilizable的子接口,但是你必须实现readExternal和writeExternal方法,你可以在这两个方法中实现具体属性的反序列化和序列化操作。然而这就意味着你必须在这两个方法中手工编写额外的代码来进行具体属性的序列化。java的transient关键字为我们提供了便利,你只需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中。
先创建一个person对象
public class Person implements Serializable{
/**
* 当类的属性添加或修改时,若版本号不变,
* 那么反序列尽可能的会兼容现有版本
* 若版本变了,反序列会抛出异常
*/
private static final long serialVersionUID = 1L;
private String name;
private int age;
private char gender;
private transient double salary;
//private transient double salary;
private List<String> Intro;
public String toString() {
return "Person [name=" + name + ", age=" + age + ", gender=" + gender + ", salary=" + salary + ", Intro="
+ Intro + "]";
}
public Person(String name, int age, char gender, double salary, List<String> intro) {
super();
this.name = name;
this.age = age;
this.gender = gender;
this.salary = salary;
Intro = intro;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public List<String> getIntro() {
return Intro;
}
public void setIntro(List<String> intro) {
Intro = intro;
}
将对象写入一个文件
public class OOSDemo {
public static void main(String[] args) throws IOException {
List <String>list = new ArrayList<String >();
list.add("中国人民");
list.add("汉族");
Person person = new Person("jacky",22,'男',1000,list);
FileOutputStream fos = new FileOutputStream("person.obj");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(person);
System.out.println("序列化完毕");
oos.close();
}
}
运行结果:
序列化完毕
ObjectInputStream
是一个高级流,可以将一组字节转换为对应的对象
用于对象的反序列化
public class OISDemo {
public static void main(String[] args) throws IOException, ClassNotFoundException {
FileInputStream fis = new FileInputStream("person.obj");
ObjectInputStream ois = new ObjectInputStream(fis);
Person p = (Person) ois.readObject();
System.out.println(p);
ois.close();
}
}
运行结果:
Person [name=jacky, age=22, gender=男, salary=0.0, Intro=[中国人民, 汉族]]
在上面的例子中,我将属性salary前添加关键字transient,我们看到虽然我们序列化的对象name的属性值为“jacky”,但是当我们反序列化之后发现这个属性为空,说明这个属性没有进行序列化。