超级奇怪的序列化问题

侠雨飞飞 2006-12-11 02:38:11
我写了一个方法,把当前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里有几个标签控件,就循环几次
然后写入


郁闷~~

...全文
508 32 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
syoumei 2006-12-12
  • 打赏
  • 举报
回复
的确transient在序列化的时候将被忽视
但是swing下面的FileFilter没有序列化 但不等于不能序列化
你帮我测试下
import java.io.Serializable;
class BgFileChooser implements Serializable{

class JAVAFileFilter extends FileFilter implements Serializable{}

}
这样改改看

至于为啥File f=bfc.getFile(this);出错,没理解!
能否发一份你的代码让我学习下
我的msn happyeveryday2me@hotmail.com

谢谢
侠雨飞飞 2006-12-12
  • 打赏
  • 举报
回复
赫赫,楼上,你赌输了
我的MyLabel类还真没有用到
BgFileChooser bfc=new BgFileChooser();
File f=bfc.getFile(this);
这两句

JAVAFileFilter是实现了FileFilter的一个自定义类
我把其中相关字段都设置成transient了,还是不行
这个FileFilter本身就是不支持序列化的,你可以试试

anyway,Thanks
syoumei 2006-12-12
  • 打赏
  • 举报
回复
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

只能用晕翻表示我的态度
fool_leave 2006-12-12
  • 打赏
  • 举报
回复
哈哈

你可以运行了,俺也高兴
以前做Object流的时候也遇到好多问题,烦
侠雨飞飞 2006-12-12
  • 打赏
  • 举报
回复
哈哈哈
果真是这个问题!
单独开个贴给你100分罢
侠雨飞飞 2006-12-12
  • 打赏
  • 举报
回复
好,我试验下
成了再单独给你加分
侠雨飞飞 2006-12-12
  • 打赏
  • 举报
回复
我也想不通啊!!
代码是我不想贴,太长了贴不全
楼上有兴趣的话,留下邮箱,我发给你好了
fool_leave 2006-12-12
  • 打赏
  • 举报
回复
我明白了

如果是这个问题,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);
可以不?如果可以,你测试一下看看,不行就去掉吧
syoumei 2006-12-12
  • 打赏
  • 举报
回复

LZ我还是想不通阿
s.writeObject(items);
执行这句话怎么会报这个错
java.io.NotSerializableException: gktsys.frame.BgFileChooser$JAVAFileFilter
贴下代码 让我学习下
侠雨飞飞 2006-12-12
  • 打赏
  • 举报
回复
二位,问题和我的MyLabel类一点关系没有,我已经强调了如果没有调用文件选择类的话,序列和反序列一点问题都没有。

何况,我的MyLabel只是简单继承JLable而已,这个是已经实现序列化接口的。
侠雨飞飞 2006-12-12
  • 打赏
  • 举报
回复
已发
syoumei 2006-12-11
  • 打赏
  • 举报
回复
哎 不提了 这个lz不听劝 换帖子玩了
syoumei 2006-12-11
  • 打赏
  • 举报
回复

能贴下MyLabel的代码吗
fool_leave 2006-12-11
  • 打赏
  • 举报
回复
哈哈哈哈哈哈哈

lz,你也知道了吧
MyLabel 里面的所有变量都必须是可序列化的

赶快把BgFileChooser序列化一下。注意变量的变量也必须可序列化
侠雨飞飞 2006-12-11
  • 打赏
  • 举报
回复

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)
。。。。
fool_leave 2006-12-11
  • 打赏
  • 举报
回复
你用ex.printStack好不?
gktsys.frame.BgFileChooser$JAVAFileFilter什么东西?只是Exception的message
你的Exception是什么Exception
侠雨飞飞 2006-12-11
  • 打赏
  • 举报
回复
问题我已经描述的很清楚不过了
syoumei 2006-12-11
  • 打赏
  • 举报
回复
的确compment已经实现了Serializable
但问题一定还是出在你自己的label类里


我写了段测试代码
class a implements Serializable
{
b b=new b();
}

class b
{
}

你自己测试下items.add(new a()) 然后写对象
fool_leave 2006-12-11
  • 打赏
  • 举报
回复
我也知道了

s.close
再f.close
当然报错了


不知道有没有分,这么到位
fool_leave 2006-12-11
  • 打赏
  • 举报
回复
啥子问题,异常啥玩意?
加载更多回复(12)

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧