嗯,试了一下。文件头倒是一样了,不过又发现,把element写文件时,比如Circel类,在文件里还会有:nt2000..picedit..Element$Circel这样的工程..包..类$内置类这样的标记。虽然没在另一个工程里试,不过估计还是一样。在Circel的writeObject中,只写了:out.writeDouble(circle.width);读时:double width = in.readDouble(); circle = new Ellipse2D.Double(0,0,width,width); 不知要怎处理了,好在对手头工程没什么影响。 贴子再放一、二天吧,看看大家还有什么意见,到时一定结贴。 谢谢。
既然你们所要的文件只是为了和别的公司交换数据用,那么为什么不用XML呢?中性的XML天生就是数据交换的好载体。举一个简单的例子: -------------------------------- XMLEncoder xmlencd = new XMLEncoder( new BufferedOutputStream( new FileOutputStream( "c:/myinf.xml" ) ) );
2、“你在写入文件的时候流好象用错了,具体你看下书上用的什么流。”用的流肯定没问题,因为我用各自的程序生成的文件存储和读取各自的对象,都是正常的。
3、我要写的对象是SketchModel类,当然实现了Serializable接口。
4、大家好象并没有完全明白我的意思:两个程序独立工作都是正常的,对象可以被存储和读回,但两个程序产生的文件无法被对方读取,虽然存储的对象数据结构和读写文件的方法是一模一样的。
5、今天对比了一下两个程序生成的文件,发现其唯一的区别是:一个文件头为:..sr..nt2000..picedit..sktechmodel,另一个为::..sr..sktechmodel,后面是一样的。前面的nt2000..picedit是我的工程名称和包名称,后面一个不在包里头。
如果是一样的,那么a.A.java == b.A.java,那不得天下大乱:)
m_model = (SketchModel)in.readObject();
这一句即使不做类型转换,写成:Object obj = in.readObject();仍然抛出同样的异常。
private static final String fileFlag = "XXX_FILE";
然后在你写对象的前一行,也就是
out.writeObject(m_model);
的前面加一行,
out.writeObject(fileFlag);
这样文件头就一样了,然后,在读取对象的类中,读取对象的语句前面加上
String s = (String) in.readObject();
if(!s.equals(fileFlag)) {
throw new IOException("...");
}
然后再
m_model = (SketchModel)in.readObject();
这样试一下。不知道行不行 :)
试了,即使是本程序的读写都不行。
email: [email protected]
愿意与老兄你共同研究这个难题:)
import java.util.Observable;
import java.util.LinkedList;
import java.util.Iterator;
import java.io.Serializable;class SketchModel extends Observable implements Serializable {
public boolean remove(Element element) {
boolean removed = elementList.remove(element);
if(removed) {
setChanged();
notifyObservers(element.getBounds());
} return removed;
}
public void add(Element element) {
elementList.add(element);
setChanged();
notifyObservers(element.getBounds());
} public Iterator getIterator() {
return elementList.listIterator();
} protected LinkedList elementList = new LinkedList();
}
public void add(Element element) 中的Element较长,就不贴了,它是一个保存基本图形单元的类,如:Line,保存其颜色、长度、位置等信息。
我上星期刚做了个模拟考试系统,我们老师布置的项目,用的是tableModel,存储数据用的是Vector,我是把Vector的对象往文件里边写,同样是写对象。
circle = new Ellipse2D.Double(0,0,width,width);
不知要怎处理了,好在对手头工程没什么影响。
贴子再放一、二天吧,看看大家还有什么意见,到时一定结贴。
谢谢。
--------------------------------
XMLEncoder xmlencd =
new XMLEncoder(
new BufferedOutputStream(
new FileOutputStream( "c:/myinf.xml" ) ) );
xmlencd.writeObject( myinf ); //myinf就是你要系列化的对象
xmlencd.close();
--------------------------------如果你要系列化的对象包含的信息都可以转换为字符文本信息,那么用上面的代码就可以直接的系列化对象了,如果包含非字符文本的二进制或多媒体数据,那就需要一套编码解码机制将数据在二进制和字符数据之间转换了。你的程序要实现的功能同样是对象的系列化,用xml多简单?而且兼容性和扩展性也要强的多呢。
其实我也并没有和别公司交换数据的需要,只是正好发现了这个问题而已,想看看大家都是怎么处理系列化的。
感谢大家对我的帖子的支持,希望今后继续,结贴了。