@Override public Point2D getP1() { // TODO Auto-generated method stub return line.getP1(); } @Override public Point2D getP2() { // TODO Auto-generated method stub return line.getP2(); } @Override public double getX1() { // TODO Auto-generated method stub return line.getX1(); } @Override public double getX2() { // TODO Auto-generated method stub return line.getX2(); } @Override public double getY1() { // TODO Auto-generated method stub return line.getY1(); } @Override public double getY2() { // TODO Auto-generated method stub return line.getY2(); } @Override public void setLine(double x1, double y1, double x2, double y2) { // TODO Auto-generated method stub line.setLine(x1, y1, x2, y2); } public Rectangle2D getBounds2D() { // TODO Auto-generated method stub return line.getBounds2D(); }
}import java.io.*; public class TestObj { public static void main(String[] args) throws Exception { ObjectOutputStream oos = new ObjectOutputStream( new FileOutputStream("c:/t.ser")); MyLine line=new MyLine(1,1,2,2);//一条(1,1)->(2,2)的直线 oos.writeObject(line);//序列化写到文件中 oos.close(); }} 另外:若要自己用XML(或其它任何形式如:XDR或干脆二进制0、1并自己压缩等),都是自己定义了自己的一套序列化编码而已。若要方便,倒不如直接利用JAVA的序列化机制。 以上仅供你参考
十分感谢您的热心帮助,刚才用您提供的代码试了一下,还是抛出异常,以下是异常信息:Exception in thread "main" java.io.NotSerializableException: java.awt.geom.Line2D$Double at java.io.ObjectOutputStream.writeObject0(Unknown Source) at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source) at java.io.ObjectOutputStream.writeSerialData(Unknown Source) at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) at java.io.ObjectOutputStream.writeObject0(Unknown Source) at java.io.ObjectOutputStream.writeObject(Unknown Source) at TestObj.main(TestObj.java:7)
答:怎么可能呢? 代码在我的机器上运行很正常啊。(MyEclipse5.5+JDK1.6的JRE)。 而且:java.awt.geom.Line2D$Double的定义源代码就在JDK的SRC中,是如下定义的: public abstract class Line2D implements Shape, Cloneable { ... //内部类的定义 public static class Double extends Line2D implements Serializable { ... }
public class MyLine extends java.awt.geom.Line2D implements Serializable
{
此处代码其实就是将Line2D的抽象方法实现一下而已。若,没有抽象方法,则什么都不用做。
}
其它方法还有不少。比如自己定义一个格式,在网络上传。(自己定义编码与反编码。用二进制或XML就看具体应用了)以上仅供你参考。
答: 这怎么可能!我以前在写网络协同式矢量图形编辑器时,就是这样序列化的,并做了定制处理。你的代码是如何写的?
我给你一个代码,请你参考(当然测试通过了)。当然具有Line2D的正常功能,同时又能正常序列化。import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.io.*;public class MyLine extends Line2D implements Serializable
{
private Line2D.Double line=null;//双精度的两个点p1,p2的直线
//(0,0)->(0,0)直线
public MyLine()
{
line=new Double();
}
//( X1, Y1)->( X2, Y2)直线
public MyLine(double X1, double Y1, double X2, double Y2)
{
line=new Double( X1, Y1, X2, Y2);
}
//(p1)->(p2)直线
public MyLine(Point2D p1, Point2D p2)
{
line=new Double( p1, p2);
}
@Override
public Point2D getP1() {
// TODO Auto-generated method stub
return line.getP1();
} @Override
public Point2D getP2() {
// TODO Auto-generated method stub
return line.getP2();
} @Override
public double getX1() {
// TODO Auto-generated method stub
return line.getX1();
} @Override
public double getX2() {
// TODO Auto-generated method stub
return line.getX2();
} @Override
public double getY1() {
// TODO Auto-generated method stub
return line.getY1();
} @Override
public double getY2() {
// TODO Auto-generated method stub
return line.getY2();
} @Override
public void setLine(double x1, double y1, double x2, double y2) {
// TODO Auto-generated method stub
line.setLine(x1, y1, x2, y2);
} public Rectangle2D getBounds2D() {
// TODO Auto-generated method stub
return line.getBounds2D();
}
}import java.io.*;
public class TestObj {
public static void main(String[] args) throws Exception {
ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream("c:/t.ser"));
MyLine line=new MyLine(1,1,2,2);//一条(1,1)->(2,2)的直线
oos.writeObject(line);//序列化写到文件中
oos.close();
}}
另外:若要自己用XML(或其它任何形式如:XDR或干脆二进制0、1并自己压缩等),都是自己定义了自己的一套序列化编码而已。若要方便,倒不如直接利用JAVA的序列化机制。
以上仅供你参考
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at TestObj.main(TestObj.java:7)
代码在我的机器上运行很正常啊。(MyEclipse5.5+JDK1.6的JRE)。
而且:java.awt.geom.Line2D$Double的定义源代码就在JDK的SRC中,是如下定义的:
public abstract class Line2D implements Shape, Cloneable {
...
//内部类的定义
public static class Double extends Line2D implements Serializable {
...
}
解决了,我没把Eclipse里的JRE路径改成1.6,还是用的1.5,不过怎么1.5不行呢?十分感谢您的帮助