A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wangpan 中级黑马   /  2013-5-26 20:22  /  1659 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 wangpan 于 2013-5-29 20:41 编辑

FileInputStream和FileOutputSream操作对象时,对象中有静态成员的一个例子。
下面是一个Person类:
  1. package fighting;
  2. import java.io.Serializable;
  3. public class Person implements Serializable{
  4. //给person类提供一个固定的标识UID,新的类还能操作曾经被序列化的对象
  5. public static final long serialVersionUID = 42L;
  6. private String name;
  7. transient int age;//加了transient关键字,age将不能被序列化,保证其值在堆内存中存在,而不在文本文件中存在
  8. static String country = "cn";
  9. Person(String name,int age,String country){
  10.            this.name= name;
  11.            this.age=age;
  12.            this.country=country;
  13. }
  14. public String toString(){
  15.            return name+":"+age+":"+country;
  16. }
  17. }
复制代码
下面是我的ObjectDemo类,这个类是要使用上面的Person类的。
  1. package fighting;

  2. import java.io.FileInputStream;
  3. import java.io.FileNotFoundException;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.io.ObjectInputStream;
  7. import java.io.ObjectOutputStream;

  8. public class ObjectStream {
  9.        public static void main(String[] args) throws IOException, ClassNotFoundException {
  10.                writeObjec();
  11.                readObject();
  12.        }
  13.        public static void readObject() throws IOException, ClassNotFoundException{
  14.                 FileInputStream fis = new FileInputStream("src/info.txt");
  15.                 ObjectInputStream ois=new ObjectInputStream(fis);
  16.                 Person p = (Person)ois.readObject();
  17.                 System.out.println(p);
  18.                 ois.close();
  19.         }
  20.         public static void writeObjec() throws IOException{
  21.                 FileOutputStream fos = new FileOutputStream("src/info.txt");
  22.                 ObjectOutputStream oos = new ObjectOutputStream(fos);
  23.                 Person person = new Person("wangpan",10,"en");
  24.                 oos.writeObject(person);
  25.                 oos.close();
  26.          }
  27. }
复制代码
我在main()方法里只有两行代码,现在的结果是这样的:
1, writeObjec();
      //readObject();
       在执行
writeObjec();的时候,把第二行的readObject();注释掉,运行一次。然后,
       //writeObjec();
       readObject();
       像上面这样,把writeObjec();注释掉,只运行readObject();
       这样的结果为:wangpan:0:cn

2,writeObjec();
     readObject();
      上面这两句,都不注释掉,同时执行,结果却不同:wangpan:0:en

大家想想,这是为什么呢?





评分

参与人数 1技术分 +2 收起 理由
袁梦希 + 2 神马都是浮云

查看全部评分

2 个回复

倒序浏览
static 变量没有办法序列化serialization

连续用writeObject() ;readObject() ; 之所以读出en,是读出的堆栈中的en(是初始化的en,不是文件中对象的);

当你先用writeObject() 时, en是写不进硬盘文件的,  然后readObject() 时的对象时,没有country的具体值的,读取了默认的static cn, 所以输出了 cn

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

回复 使用道具 举报
刘勇强 发表于 2013-5-29 13:05
static 变量没有办法序列化serialization

连续用writeObject() ;readObject() ; 之所以读出en,是读出的 ...

噢~明白了,似乎是这样,3q
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马