我写了一个方法,把当前panel里的组件遍历,然后序列化
  public void jButton1_mouseClicked(MouseEvent e) {
  //保存,对象串行化
FileOutputStream f = null;
try {
   
    f = new FileOutputStream("tmp");} catch (FileNotFoundException ex) {
     System.out.println(ex.getMessage());
}
ObjectOutputStream s = null;
try {
    s = new ObjectOutputStream(f);
    items=new ArrayList();
   //遍历得到当前所有组件
   int n=jPanel3.getComponentCount();
   System.out.println("totlal="+n);
   for(int i=0;i<n;i++){
       Component c=jPanel3.getComponent(i);
       System.out.println(c.getClass().toString());
       MyLabel jl=(MyLabel)c;
       items.add(jl);
   }
   s.writeObject(items); //循环完后,在此跳转到异常报错
    s.flush();
   s.close();
   f.close();
} catch (IOException ex1) {
    System.out.println("序列化失败:"+ex1.getMessage());
}    }每次执行,正常循环完后,一到写入那步就报错
而之前我在程序中没有加入一个打开文件过滤类时候,根本就不报错
但那个过滤类跟这一点关系都没有啊
我在panel里有几个标签控件,就循环几次
然后写入
郁闷~~

解决方案 »

  1.   

    似乎是Java的一个bug
    faint~
      

  2.   

    MyLabel类 写上 implements Serializable就可以了over
      

  3.   

    异常特别简单,就输出了出错类的名字
    gktsys.frame.BgFileChooser$JAVAFileFilter下面是这个用来得到文件路径类的完整定义
    package gktsys.frame;import java.io.File;
    import javax.swing.JFileChooser;
    import java.awt.Component;
    import javax.swing.filechooser.FileFilter;/**
     * <p>Title: </p> *
     * <p>Description: </p>
     *
     * <p>Copyright: Copyright (c) 2006</p>
     *
     * <p>Company: </p>
     *
     * @author not attributable
     * @version 1.0
     */
    //得到背景文件类
       class BgFileChooser{
           transient JFileChooser fileChooser=new JFileChooser();
           transient JAVAFileFilter fJpg=new JAVAFileFilter("jpg");
           transient JAVAFileFilter fJpeg=new JAVAFileFilter("jpeg"); 
           public File getFile(Component cp){
               ;
               fileChooser=new JFileChooser("C:\\winnt");//以c:\\winnt为打开文件为对话框的默认路径
    //利用addChoosableFileFilter()方法加入欲过滤的文件类型,使用addChoosableFileFilter()可以加入多种文件类型,
    //若你只需要过滤出一种文件类型,可使用setFileFilter()方法.
               File file = null;            fileChooser.addChoosableFileFilter(fJpg);
                fileChooser.addChoosableFileFilter(fJpeg);
               int result = fileChooser.showOpenDialog(cp);
               if (result == JFileChooser.APPROVE_OPTION) {
                   file = fileChooser.getSelectedFile();           } 
               return file;       }       //以JAVAFileFilter类继承FileFilter抽象类,并实现accept()与getDescription()方法.
           class JAVAFileFilter extends FileFilter{
               String ext;
               public JAVAFileFilter(String ext){
                   this.ext=ext;
               }
              /*在accept()方法中,当程序所抓到的是一个目录而不是文件时,我们返回true值,表示将此目录显示出来.*/
               public boolean accept(File file){
                 if (file.isDirectory()){
                    return true;
                 }
                 String fileName=file.getName();
                 int index=fileName.lastIndexOf('.');
                 if (index>0 && index<fileName.length()-1){
                     //表示文件名称不为".xxx"现"xxx."之类型
                     String extension=fileName.substring(index+1).toLowerCase();
                     //若所抓到的文件扩展名等于我们所设置要显示的扩展名(即变量ext值),则返回true,表示将此文件显示出来,否则返回
                     //true.
                     if (extension.equals(ext))
                       return true;
                 }
                 return false;
               }
               //实现getDescription()方法,返回描述文件的说明字符串!!!
               public String getDescription(){
                   if (ext.equals("jpg"))
                       return "JPG(*.JPG)";
                   if (ext.equals("jpeg"))
                      return "JPEG(*.JPEG)";
           
                   return "";
               }
           
           
    }
        }我的主应用只是创建了这个类的一个实例,然后调用方法得到File而已
    但这样一来,却干扰了我的序列化
      

  4.   

    我的组件之前序列化是没有问题的,但一调用这个文件选择后,就不能正常序列了
    这才是奇怪的地方主要是FileFilter在作怪
      

  5.   

    调用的语句:
      BgFileChooser bfc=new BgFileChooser();
              File f=bfc.getFile(this);
    就这两行屏蔽这两行,序列化,反序列化一切正常
      

  6.   

    System.out.println("序列化失败:"+ex1.getMessage());系统输出:
    序列化失败:gktsys.frame.BgFileChooser$JAVAFileFilter好像我对JAVAFileFilter进行序列化一样,但实际上,根本没有
      

  7.   

    我也知道了s.close
    再f.close
    当然报错了
    不知道有没有分,这么到位
      

  8.   

    的确compment已经实现了Serializable
    但问题一定还是出在你自己的label类里
    我写了段测试代码
     class a  implements Serializable
     {
     b b=new b();
     } class b
     {
     }你自己测试下items.add(new a()) 然后写对象
      

  9.   

    你用ex.printStack好不?
    gktsys.frame.BgFileChooser$JAVAFileFilter什么东西?只是Exception的message
    你的Exception是什么Exception
      

  10.   


    java.io.NotSerializableException: gktsys.frame.BgFileChooser$JAVAFileFilter
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1075)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1369)
    at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:380)
    at javax.swing.JFileChooser.writeObject(JFileChooser.java:1806)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:585)
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:890)
      

  11.   

    哈哈哈哈哈哈哈lz,你也知道了吧
    MyLabel 里面的所有变量都必须是可序列化的赶快把BgFileChooser序列化一下。注意变量的变量也必须可序列化
      

  12.   

    二位,问题和我的MyLabel类一点关系没有,我已经强调了如果没有调用文件选择类的话,序列和反序列一点问题都没有。何况,我的MyLabel只是简单继承JLable而已,这个是已经实现序列化接口的。
      

  13.   


    LZ我还是想不通阿
    s.writeObject(items);
    执行这句话怎么会报这个错
    java.io.NotSerializableException: gktsys.frame.BgFileChooser$JAVAFileFilter
    贴下代码 让我学习下
      

  14.   

    我明白了如果是这个问题,lz一定要强烈给我加分哦你的JFileChooser在show的时候将this做为参数传入(暂时认为你的this是JFrame)
    那么JFileChooser就有this的引用,同时this也有JFileChooser的引用(这个肯定了,上一级窗口保存下一级窗口的引用)
    但子窗口也保存上级窗口的引用(parent属性)这样,实际上你的MyLabel里面都包含了this,this也包含了JFileChoose,当然间接的MyLabel对象中也包含着JFileChoose。序列化要求某一个对象的所有属性包括属性的属性都必须可序列化,自然报错了
    BgFileChooser bfc=new BgFileChooser();
    File f=bfc.getFile(null);
    可以不?如果可以,你测试一下看看,不行就去掉吧
      

  15.   

    哈哈你可以运行了,俺也高兴
    以前做Object流的时候也遇到好多问题,烦
      

  16.   

    BgFileChooser bfc=new BgFileChooser();
     File f=bfc.getFile(this);
     真不知道你写成null还要这句干吗
     
    打赌了BgFileChooser bfc=new BgFileChooser();
    File f=bfc.getFile(this);
    这2句就是你mylabel设计到的java.io.NotSerializableException: gktsys.frame.BgFileChooser$JAVAFileFilter
    不想办法把这个JAVAFileFilter类序列化
    反而去设置null只能用晕翻表示我的态度
      

  17.   

    赫赫,楼上,你赌输了
    我的MyLabel类还真没有用到
    BgFileChooser bfc=new BgFileChooser();
    File f=bfc.getFile(this);
    这两句JAVAFileFilter是实现了FileFilter的一个自定义类
    我把其中相关字段都设置成transient了,还是不行
    这个FileFilter本身就是不支持序列化的,你可以试试anyway,Thanks
      

  18.   

    的确transient在序列化的时候将被忽视
    但是swing下面的FileFilter没有序列化 但不等于不能序列化
    你帮我测试下
    import java.io.Serializable;
     class BgFileChooser implements Serializable{class JAVAFileFilter extends FileFilter implements Serializable{}}
    这样改改看至于为啥File f=bfc.getFile(this);出错,没理解!
    能否发一份你的代码让我学习下
    我的msn [email protected]谢谢