PeopleName 是一个人名对象,包含三个成员变量:firstName、middleName、lastName,非常适合用默认的序列化形式。
下面说什么是默认序列化形式,默认序列化形式表现上来说就是只要实现Serializable ,任何其它的事情都不需要做了。
public class PeopleName implements Serializable
{
private static final long serialVersionUID = -4324501794882864932L;
private String lastName;
private String firstName;
private String middleName;
PeopleName(String firstName,String middleName,String lastName)
{
this.firstName = firstName;
this.middleName = middleName;
this.lastName = lastName;
}
public String getLastName() {
return lastName;
}
public String getFirstName() {
return firstName;
}
public String getMiddleName() {
return middleName;
}
}
如何使用:
@Test
public void testOut() throws FileNotFoundException, IOException {
PeopleName luren01 = new PeopleName("吊","炸","天");
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("D:\\temp.txt"));
out.writeObject(luren01);
out.flush();
out.close();
}
@Test
public void testIn() throws FileNotFoundException, IOException, ClassNotFoundException {
ObjectInputStream in = new ObjectInputStream(new FileInputStream("D:\\temp.txt"));
PeopleName temp = (PeopleName)in.readObject();
in.close();
System.out.println(temp.getFirstName()+"-"+temp.getMiddleName()+"-"+temp.getLastName());
}
序列化的用法大概就是上面了,将对象以流的形式存储,然后可以从存储的流中还原对象
然后我又在PeopleName中添加了writeObject(ObjectOutputStream out)、readObject(ObjectInputStream in)方法,只是这里我仍然仅仅用out.defaultWriteObject();in.defaultReadObject();来实现序列化,然后加了两个打印语句,
/*private void writeObject(ObjectOutputStream out) throws IOException
{
out.defaultWriteObject();
System.out.println("这里的方法吧?");
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
{
in.defaultReadObject();
System.out.println("确实是调用这里的方法!");
}*/
这样做是为了验证在序列化过程中,在序列化类实现了writeObject/readObject的情况下,是不是会调用这两个方法(其实这已经是自定义序列化的范畴了)
答案是肯定的,确实是调用了这里的方法。
所以过程应该是这样的:
out.writeObject(luren01);/PeopleName temp = (PeopleName)in.readObject();在执行时,程序会检测luren01/in中包含的对象,是否实现writeObject(ObjectOutputStreamout)/readObject(ObjectInputStream in),
如果实现则调用对象的writeObject/readObject方法,这就是自定义序列化。
如果没有实现则使用默认的序列化形式,默认序列化形式使用的就是out.defaultWriteObject();/in.defaultReadObject();,所以上面示例的writeObject/readObject跟默认序列化效果是相同的
至于为什么会在out.writeObject(luren01);/PeopleName temp = (PeopleName)in.readObject();访问到luren01/in中的对象的writeObject/readObject方法,则应该是序列化框架实现的,通过钩子函数、反射等等途径,能够看到要序列化或者反序列化的对象中是实现了writeObject/readObject,如果实现的话就会调用。当然这些都是大概的一种推测,目前来看是不准备细究了,以后有必要的话再说。