要实现一个文件存储的功能,要把很多类的实例存储起来。
比如创建数据源,我可能创建N多个数据源,就是做这个数据源的配置信息的保存。
比如创建了类Data,并实现了Serializable接口,又创建了类DataContainer,并实现了Serializable接口;public class Data implements Serializable{        public String user = "";
public String pass = "";
        ....
        get/set方法...
}public class CommonPlanContainer implements Serializable{ private Vector<Data> data;

public Vector<Data> getData() {
return data;
} public void setData(Vector<Data> data) {
this.data = data;
}
}
但把这个DataContainer保存进文件的时候,总提示我需要序列化
java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: com.data.Data

解决方案 »

  1.   

    参考这个例子:public class FooImpl implements java.io.Serializable{   
    private String message;   
      
    public String getFoo() {           
        return message;   
    }   
      
    public void setMessage(String message) {   
        this.message = message;   
    }   
      
    private void writeObject(java.io.ObjectOutputStream out) throws IOException {   
        System.out.println("writeObject invoked");   
        out.writeObject(this.message == null ? "hohohahaha" : this.message);   
    }   
      
    private void readObject(java.io.ObjectInputStream in) throws IOException,   
            ClassNotFoundException {   
        System.out.println("readObject invoked");   
        this.message = (String) in.readObject();   
        System.out.println("got message:" + message);   
    }   
      
    private Object writeReplace() throws ObjectStreamException {   
        System.out.println("writeReplace invoked");   
        return this;   
    }   
      
    private Object readResolve() throws ObjectStreamException {   
        System.out.println("readResolve invoked");   
        return this;   
    }   
      
    public Object serialize() throws IOException, ClassNotFoundException {   
        ByteArrayOutputStream baos = new ByteArrayOutputStream();   
        ObjectOutputStream oos = new ObjectOutputStream(baos);   
        oos.writeObject(this);   
        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());   
        ObjectInputStream ois = new ObjectInputStream(bais);   
        return ois.readObject();   
    }   
            public static void main(String[] args) throws IOException,    
                 ClassNotFoundException {   
                     FooImpl fooimpl = new FooImpl();   
                     fooimpl.serialize();   
      

  2.   

    首先你得了解序列化是干什么用的,序列化就是为了跨平台传输字节码的,也就是说你可以再xp系统上用序列化传输字节在linux系统上解码让后还能够使用,所以序列化一般在网路编程中用来在客户端和服务器端传输字节,其他地方如果是类似功能的也可以用,但还是再java网路编程中以用较多。
    像你这个例子是可以用序列化的
      

  3.   

    DataContainer??
    没这个类啊???
      

  4.   

    你只是实现了 这个接口 但是serializable 这个接口里面是没有方法的 是个空接口 你要序列化还得 通过对象流来处理 inputstream outputstream 这些流你比较熟悉吧 这个对象流也是类似的处理方式 就是
    ObjectOutputStream  和 ObjectInputStream 这两个流 用writeObject 和 readObject 来写入写出对象流详细你可以参考:http://xiebh.javaeye.com/blog/121311
      

  5.   

    http://java.sun.com/j2se/1.4.2/docs/api/java/io/Serializable.html这个是serializable 接口的详细介绍
      

  6.   


    //给你修改了一下
    import java.util.*;
    import java.io.*;class Data implements Serializable{
        public String user = "";
        public String pass = "";
    public String getUser() {
    return user;
    }
    public void setUser(String user) {
    this.user = user;
    }
    public String getPass() {
    return pass;
    }
    public void setPass(String pass) {
    this.pass = pass;
    }
        public String toString(){
         return new StringBuilder("[").append(user).append(",").append(pass).append("]").toString();
        }
    }public class CommonPlanContainer implements Serializable{ private Vector<Data> datas;
    private int size;//增加一个size属性,存放的是data里面的元素的个数

    public Vector<Data> getData() {
        return datas;
    }
    public void setData(Vector<Data> data) {
        this.datas = data;
        this.size=data.size();//给size赋初始值
    }    
    public String toString(){
    StringBuilder sb=new StringBuilder("{");
    for(Data d : datas){
    sb.append(d.toString());
    sb.append(" ");
    }
    sb.append("}");
    return sb.toString();
    }
    private void writeObject(java.io.ObjectOutputStream out) throws IOException {   
        System.out.println("writeObject invoked");  
        out.writeObject(size);//先把元素个数序列化
        for(Data d : datas){ //然后,把每一个Data对象序列化
         out.writeObject(d);
        }
    }   
    private void readObject(java.io.ObjectInputStream in) throws IOException,   
            ClassNotFoundException {   
        System.out.println("readObject invoked");  
        datas =new Vector<Data>();
        int count= ((Integer)in.readObject()).intValue();//先读出元素的个数来
        for(int i=0;i<count;i++){//再读取每一个元素,重新构造Vector
         Data d= (Data)in.readObject();
         datas.add(d);
        }
        size=count;
    }   
        public static void main(String args[])throws Exception{
         Vector<Data> datas =new Vector<Data>();
         Data d=new Data();
         d.setPass("pass");
         d.setUser("user");
         datas.add(d);
         CommonPlanContainer container = new CommonPlanContainer();
         container.setData(datas);
        
         ByteArrayOutputStream baos= new ByteArrayOutputStream();
         ObjectOutputStream oos=new ObjectOutputStream(baos);
         oos.writeObject(container);
         byte[] buff=baos.toByteArray();
         ByteArrayInputStream bain=new ByteArrayInputStream(buff);
         ObjectInputStream oin=new ObjectInputStream(bain);
         CommonPlanContainer con=(CommonPlanContainer)oin.readObject();
         System.out.println(con);
         oin.close();
         oos.close();
        }
    }
      

  7.   

    LZ vector能够序列化吗?
    像8楼那么做是可以的
      

  8.   


    根据这位哥们的方法,我做出来了。
    问题出在serialVersionUID上,需要给每个需要序列化的类定义serialVersionUID,哥们认为这个serialVersionUID就是个标示符一样的东西,用来反序列化的时候,还能找回来,但在定义的时候发现,并不是随便定义的,因为serialVersionUID是long型的,所以Data和CommonPlanContainer分别定义了5L和6L,定义成其他的(例如3L,4L等)就会出错。其中1L和2L被占其他需要序列化的类占用了。
      

  9.   

    JAVA序列化详解(串行化)http://www.phome.asia/forum/thread/23624.html