黑马程序员技术交流社区

标题: 静态成员不能被序列化,为什么序列化后却能被打印出来? [打印本页]

作者: 刘士林    时间: 2012-11-2 15:28
标题: 静态成员不能被序列化,为什么序列化后却能被打印出来?
按照视频里的讲解序列化是对对象而言的,是将堆内存中的数据写到硬盘上,方法区中的共享数据和方法不会被序列化
但是下边的程序却让我得出疑问。
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;


public class wenwen {

          public static void main(String[] args)throws Exception
          {
  
                writeObj();
                readObj();
          }
          public static void writeObj()throws IOException
         {
              ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("abc.object"));
              oos.writeObject(new Person("lili",23,"cn"));
              oos.close();
         }
         public static void readObj()throws Exception
        {
             ObjectInputStream ois=new ObjectInputStream(new FileInputStream("abc.object"));
             Person p = (Person)ois.readObject();
             System.out.println(p);
             ois.close();
       }
}
class Person implements Serializable
{   
      String name;
      transient int age;          //被transient修饰后age不能被序列化了,所以读取出来后打印结果应为0
      static String country;     //静态的也不能被序列化,因为存在于方法区中,所以读取后打印结果应为null
     Person(String name,int age,String country)
     {
         this.name=name;
         this.age=age;
         this.country=country;
     }
     public String  toString()
     {
         return(name+".."+age+".."+country);
     }
}
打印结果如下:
lili..0..cn
很明显被transient修饰的age没被序列化,打印出0,但是country被static修饰了,也不能被序列化,应打印出null,
但结果却打印出cn了,那就是被序列化了,这是怎么回事?


作者: 张忠豹    时间: 2012-11-2 16:01
静态是不能被序列化的,因为静态在方法区中,而非静态的在堆中。
针对这句的解释:因为静态不能被序列化,所以在序列化的时候,无论静态成员怎么改变,都不会影响serialVersionUID。并不是说静态成员就没有值。
而transient修饰的变量,只是一个临时变量(对于对象来说),在序列化的时候压根就不用他。要是用你的那个想法,static修饰的变量和transient修饰
的变量在序列化的时候都一样的话,我想,只要其中一个就行了,何必整两个修饰符出来!
当成员从硬盘总读出的时候,比较的是对象的当前版本号和以前的那个版本号。
如果非静态成员变量不想序列化,就在非静态成员前面用transient修饰。保证其值在堆内存中存在,而在文本文件中不存在(堆内存中存在,而不会存储到文本中)。(transient短暂的,)





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2