黑马程序员技术交流社区

标题: 对象的序列化问题求解 [打印本页]

作者: 张学永    时间: 2012-11-22 19:02
标题: 对象的序列化问题求解
  1. import java.io.Serializable;

  2. public class Person implements Serializable {
  3.         static final long serialVersionUID = 42L;
  4.     String name;
  5.     transient int age;
  6.     static String cn = "haha";
  7.         Person(String name,int age,String cn){
  8.                 this.name = name;
  9.                 this.age = age;
  10.                 this.cn = cn;
  11.                
  12.         }
  13.         public String toString(){
  14.                 return this.name+"  "+age+" : "+cn;
  15.         }

  16. }





  17. import java.io.FileInputStream;
  18. import java.io.FileNotFoundException;
  19. import java.io.FileOutputStream;
  20. import java.io.IOException;
  21. import java.io.ObjectInput;
  22. import java.io.ObjectInputStream;
  23. import java.io.ObjectOutputStream;

  24. public class ObjectTest {

  25.         /**
  26.          * @param args
  27.          */
  28.         public static void main(String[] args)throws Exception {
  29.                 // TODO Auto-generated method stub
  30.       writeObj();//1   -----这里先注释掉2,然后单独运行1,出的结果和1、2都不注释出的结果是不一样的。
  31.       readObj();//2
  32.         }
  33.         public static void readObj() throws FileNotFoundException, IOException, ClassNotFoundException{
  34.                 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.object"));
  35.                 Object obj = ois.readObject();
  36.                 System.out.println(obj.toString());
  37.                 ois.close();
  38.                
  39.         }
  40.     public static void writeObj() throws Exception{
  41.             ObjectOutputStream oos =  new ObjectOutputStream(new FileOutputStream("person.object"));
  42.             oos.writeObject(new Person("lisi",34,"china"));
  43.             oos.close();
  44.     }
  45. }

  46. 想知道同样是不能被序列化,static成员和被transient修饰有哪里不同,它们在写入和读取的时候在内存中是怎么变化的。
  47. 为什么Person里面改成 transient static int age;就可以打印出34岁来。不加static打印的就是0岁,
  48. 成员被序列化的时候
  49. 用static
  50. transient
  51. 和transient static 分别修饰有什么不同呢?
  52. 先后运行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