黑马程序员技术交流社区
标题:
对象的序列化问题求解
[打印本页]
作者:
张学永
时间:
2012-11-22 19:02
标题:
对象的序列化问题求解
import java.io.Serializable;
public class Person implements Serializable {
static final long serialVersionUID = 42L;
String name;
transient int age;
static String cn = "haha";
Person(String name,int age,String cn){
this.name = name;
this.age = age;
this.cn = cn;
}
public String toString(){
return this.name+" "+age+" : "+cn;
}
}
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class ObjectTest {
/**
* @param args
*/
public static void main(String[] args)throws Exception {
// TODO Auto-generated method stub
writeObj();//1 -----这里先注释掉2,然后单独运行1,出的结果和1、2都不注释出的结果是不一样的。
readObj();//2
}
public static void readObj() throws FileNotFoundException, IOException, ClassNotFoundException{
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.object"));
Object obj = ois.readObject();
System.out.println(obj.toString());
ois.close();
}
public static void writeObj() throws Exception{
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.object"));
oos.writeObject(new Person("lisi",34,"china"));
oos.close();
}
}
想知道同样是不能被序列化,static成员和被transient修饰有哪里不同,它们在写入和读取的时候在内存中是怎么变化的。
为什么Person里面改成 transient static int age;就可以打印出34岁来。不加static打印的就是0岁,
成员被序列化的时候
用static
transient
和transient static 分别修饰有什么不同呢?
先后运行writeObj()和readObj()和在一个程序同时运行这两个方法又有什么区别呢?结果为什么不同?
复制代码
作者:
王阳
时间:
2012-11-22 20:15
个人理解你这个应该是transient为暂时性变量,存储在内存中,生命周期到此变量不再需要时,所以不会写入进文件,至于打印出的0只是int变量的初始化值。不过如果加了static就成了静态变量,那么有且只会有一个这样的变量在内存中,所以会输出34
作者:
张学永
时间:
2012-11-22 21:02
王阳 发表于 2012-11-22 20:15
个人理解你这个应该是transient为暂时性变量,存储在内存中,生命周期到此变量不再需要时,所以不会写入进文件 ...
为什么程序运行两次,第一次写,第二次读结果是"haha";
而写和读同时运行一次就是“china”呢?它在读的时候不是读的文件的内容么?如果没有写进去,怎么读出来的
“china”呢???
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2