将堆内存中的对象存储在硬盘上
被持久化的对象必须实现了Serializble接口
write() 和 writeInt()区别:前者只存储的int的最低8位,后者存储int的4个8位全显示。
没有方法的接口称之为 标记接口,相当于把实现它的类标注一下。
Serializble接口下只有一个常量:serialVersionUID 用于实现它的子类分配一个UID,这个UID和保存在硬盘的对象的UID是一个。UID的产生是由类中的成员组成的。比如:Person类extends于Serializble接口,然后保存一个p1对象在硬盘上,这时p1对象和Person类的UID是一致的。如果在后面修改Person类的成员,下次再用Perosn类去引用p1对象时就会报错。
例:
Person.java
import java.io.Serializable;
public class Person implements Serializable
{
static final long serialVersionUID = 42L; // 手动将serialVersionUID的值固定,更改类成员也不会改变其值
String name;
transient int age; // 如果不想将某个成员序列化,就加transient
static String country = "cn"; // 静态是不能被序列化的
public Person(String name, int age)
{
// TODO Auto-generated constructor stub
this.name = name;
this.age = age;
}
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;
}
@Override
public String toString()
{
// TODO Auto-generated method stub
return name + ":" + age + ":" + country;
}
}
ObjectDemo.java
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class ObjectDemo
{
/**
* @param args
*/
public static void main(String[] args) throws Exception
{
writeObj();
readObj();
}
public static void readObj() throws Exception
{
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:\\tmp\\obj.txt"));
Person p = (Person) ois.readObject();
System.out.println(p);
ois.close();
}
public static void writeObj() throws Exception
{
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:\\tmp\\obj.txt"));
oos.writeObject(new Person("zhangsan", 30));
oos.close();
}
}