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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 神之梦 于 2013-6-21 23:27 编辑

对象序列化的代码,老师说静态是不能被序列化的。。。。。看我下面代码和结果
  1. /*
  2. 需求:将一个对象序列号,并从硬盘中读取序列化的对象
  3. */

  4. import java.io.*;
  5. //创建Peason类,实现Serializable接口
  6. class Peason implements Serializable
  7. {
  8.         //自定义serialVersionUID版本号
  9.         public final static long serialVersionUID=32L;
  10.         
  11.         private String name;
  12.         private int age;
  13.         transient String id;//使用transient关键字表示该成员不被序列化
  14.         static String country="CN";//静态成员不能序列化??????
  15.         
  16.         //构造函数
  17.         Peason(String name,int age,String id,String country)
  18.         {
  19.                 this.name=name;
  20.                 this.age=age;
  21.                 this.id=id;
  22.                 this.country=country;
  23.         }
  24.         //复写toString方法
  25.         public String toString()
  26.         {
  27.                 return name+":"+age+":"+id+":"+country;        
  28.         }
  29. }

  30. //序列化测试类
  31. class ObjectStreamDemo
  32. {
  33.         public static void main(String[] args)
  34.         {
  35.                 //指定文件
  36.                 File file =new File("obj.txt");
  37.                 Peason p=new Peason("zhangsan",63,"shenma","USA");

  38.                 //序列化指定对象
  39.                 writeObj(p,file);

  40.                 //反序列化
  41.                 readObj(file);
  42.                
  43.         }

  44.         //将指定对象序列化到指定文件中
  45.         public static void writeObj(Peason p,File file)
  46.         {
  47.                 ObjectOutputStream oos=null;
  48.                 try
  49.                 {        
  50.                         //创建写入流对象,关流文件
  51.                         oos=new ObjectOutputStream(new FileOutputStream(file));
  52.                         oos.writeObject(p);//写入对象数据
  53.                 }
  54.                 catch (IOException e)
  55.                 {
  56.                         throw new RuntimeException("对象写入失败");
  57.                 }
  58.                 finally
  59.                 {
  60.                         try
  61.                         {
  62.                                 if(oos!=null)
  63.                                         oos.close();
  64.                         }
  65.                         catch (IOException e)
  66.                         {
  67.                                 throw new RuntimeException("关流失败");
  68.                         }
  69.                 }
  70.         }

  71.         //读取指定文件中的对象,也称反序列化
  72.         public static void readObj(File file)
  73.         {
  74.                 ObjectInputStream ois=null;
  75.                 try
  76.                 {
  77.                         //创建读取流对象,关联文件
  78.                         ois =new ObjectInputStream(new FileInputStream(file));
  79.                         //读取文件中的对象
  80.                         Peason p=(Peason)ois.readObject();
  81.                         System.out.println(p);
  82.                 }
  83.                 catch (Exception e)
  84.                 {
  85.                         throw new RuntimeException("文件读取对象失败");
  86.                 }
  87.                 finally
  88.                 {
  89.                         try
  90.                         {
  91.                                 if(ois!=null)
  92.                                         ois.close();
  93.                         }
  94.                         catch (IOException e)
  95.                         {
  96.                                 throw new RuntimeException("关流失败");
  97.                         }
  98.                 }
  99.         }
  100. }
复制代码


怎么静态的country值改变了???
是我把两类写在一个文件中的问题?还是??????

10 个回复

倒序浏览
尹桥印 发表于 2013-6-20 21:50
不懂哒。等楼下大神回答

我觉得你就是大神了{:3_53:}
回复 使用道具 举报

呀,尹兄变斑竹了,啥时候的事,不散点金币来庆祝下么

评分

参与人数 1黑马币 +1 收起 理由
特殊服务 + 1 够了吧~~嘎嘎

查看全部评分

回复 使用道具 举报
静态的不可以被序列化,静态的变量在方法区中,序列化的只能用于对象,对象在堆内存中。所以它们在两个地方,静态变量的值是null。
回复 使用道具 举报
金辉 发表于 2013-6-20 22:09
静态的不可以被序列化,静态的变量在方法区中,序列化的只能用于对象,对象在堆内存中。所以它们在两个地方 ...

country是静态的CN,
但我在构造对象时修改为了USA
序列化后,读取出来变成了USA了
不知道咋整的
回复 使用道具 举报
首先告诉你,确实没有被实例化:
然后修改对象后,直接反序列化。


获取结果为:






        // 读取文件中的对象
                        Person p = (Person) ois.readObject();

                        System.out.println(p);



你在这个地方直接将对象打印了。那么static 修饰的成员会被所有对象共享,实际上static修饰的成员是在静态区中。所以将对象的属性打印出来了

1.jpg (4.04 KB, 下载次数: 0)

1.jpg

2.jpg (15.17 KB, 下载次数: 0)

2.jpg

3.jpg (3.98 KB, 下载次数: 0)

3.jpg
回复 使用道具 举报
Super_Class 发表于 2013-6-20 22:49
首先告诉你,确实没有被实例化:
然后修改对象后,直接反序列化。

如果
想象老师视频中讲的一样,不被反序列化该怎么做??:handshake
回复 使用道具 举报
神之梦 发表于 2013-6-20 22:56
如果
想象老师视频中讲的一样,不被反序列化该怎么做??

改序列号就可以了
回复 使用道具 举报
金辉 高级黑马 2013-6-21 00:50:58
9#
刚开始是因为序列化没结束,内存中静态成员在方法区中,这时程序没有结束,接着进行了反序列化,文件中读不到静态的,但内存中的还没释放,所以会出想这种情况。
把序列化和反序列化分别运行就好了

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 感谢辉辉!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马