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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© bird_not_fat 中级黑马   /  2013-10-12 12:28  /  1316 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 bird_not_fat 于 2013-10-14 11:38 编辑
  1. import java.io.Serializable;

  2. //这个类必须是实现了可序列化接口的
  3. public class Fruit implements Serializable{
  4.         //自定义一个固定的序列化版本号
  5.         public static final long serialVersionUID = 30L;
  6.         private String apple;
  7.         private String orange;
  8.         private String watermelon;
  9.         private static String banana;
  10.         //constructor
  11.         public Fruit(String apple,String orange,String watermelon,String banana){
  12.                 this.apple = apple;
  13.                 this.orange = orange;
  14.                 this.watermelon = watermelon;
  15.                 this.banana = banana;
  16.         }
  17.         public String getBanana() {
  18.                 return banana;
  19.         }
  20.         public void setBanana(String banana) {
  21.                 this.banana = banana;
  22.         }
  23.         //setter and getter
  24.         public String getApple() {
  25.                 return apple;
  26.         }
  27.         public void setApple(String apple) {
  28.                 this.apple = apple;
  29.         }
  30.         public String getOrange() {
  31.                 return orange;
  32.         }
  33.         public void setOrange(String orange) {
  34.                 this.orange = orange;
  35.         }
  36.         public String getWatermelon() {
  37.                 return watermelon;
  38.         }
  39.         public void setWatermelon(String watermelon) {
  40.                 this.watermelon = watermelon;
  41.         }
  42. }
复制代码
在这个类中我设置了一个静态属性banana,理论上静态存在于方法区内,序列化只能序列化堆内存中的对象,按理说banana是不能被序列化的。可是
下面代码:
  1. import java.io.File;
  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. /**
  9. * 示例:目的是对堆内存中的对象进行持久化存储
  10. *     因为是对对象进行操作,所以咱们采用对象流
  11. *     源和目标都是文件,所以对象流包装文件输入输出流
  12. * @author lt
  13. */
  14. public class ObjectStreamDemo {
  15.         //序列化方法
  16.         public static void toSerial(Object obj,File saveFile) throws FileNotFoundException,IOException{
  17.                 ObjectOutputStream oos = null;
  18.                 oos = new ObjectOutputStream(new FileOutputStream(saveFile));
  19.                 oos.writeObject(obj);
  20.                
  21.         }
  22.         //反序列化方法
  23.         public static Object fromSerial(File saveFile) throws FileNotFoundException,IOException, ClassNotFoundException{
  24.                 ObjectInputStream ois = null;
  25.                 ois = new ObjectInputStream(new FileInputStream(saveFile));
  26.                 Object getObj = ois.readObject();
  27.                 return getObj;
  28.         }
  29.         public static void main(String[] args) {
  30.                 Fruit fruit = new Fruit("苹果","橘子","西瓜","香蕉");
  31.                 File file = new File("d://serial.txt");
  32.                 if(file.exists()){
  33.                         try {
  34. //                                toSerial(fruit,file);
  35.                                 Fruit getFruit = (Fruit)fromSerial(file);
  36.                                 System.out.println(getFruit.getApple() + "---" +
  37.                                                            getFruit.getOrange() + "---" +
  38.                                                            getFruit.getWatermelon() + "---" +
  39.                                                            getFruit.getBanana());
  40.                         } catch (FileNotFoundException e) {
  41.                                 System.out.println("无法再当前路径下创建文件!");
  42.                         } catch (IOException e) {
  43.                                 System.out.println("对象流操作的文件不存在!");
  44.                         } catch (ClassNotFoundException e) {
  45.                                 System.out.println("序列化文件未找到!");
  46.                         }                        
  47.                 }else{
  48.                         try {
  49.                                 file.createNewFile();
  50.                         } catch (IOException e) {
  51.                                 System.out.println("serial.txt创建失败!");
  52.                         }
  53.                 }
  54.         }
  55. }
复制代码
运行结果: 苹果---橘子---西瓜---香蕉,香蕉也打印出来了,说明序列化成功了,这是为什么呢??

评分

参与人数 1技术分 +1 收起 理由
To + 1 神马都是浮云

查看全部评分

2 个回复

倒序浏览
静态成员是无法被序列化,它随着类的加载而存在于静态方法去中,先于对象的存在而存在,所以在调用的时候是可以显示出来的,但是并不是因为它被序列化了。
回复 使用道具 举报
To 金牌黑马 2013-10-14 09:22:17
藤椅
楼主你好,如果问题已解决请将帖子状态修改为提问结束,如果未解决请继续提问,谢谢合作
如果不会修改请看解释帖:http://bbs.itheima.com/thread-89313-1-1.html
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马