序列化arraylist时出错。获取NotSerializable异常。即使在实现Serializable之后

时间:2018-10-10 08:06:48

标签: java

我正在努力实现以下目标...

  1. 我有一个class类型的ArrayList,用于存储类对象

  2. 每次存储新对象时,我都会对其进行序列化并清除以前的对象。

  3. 我有添加搜索删除等方法。

  4. 当我尝试添加时,我得到了异常,

    捕获到的异常:java.io.NotSerializableException:java.io.BufferedReader

代码:

public static ArrayList<Library> bookData = new ArrayList<Library>();


public void addBook()
{
    objCount++;
    try{
        System.out.println("_________________Enter Book Details_________________");
        System.out.println(" Enter title of the Book    : ");
        this.setBookTitle();
        System.out.println(" Enter the Name of Author   : ");
        this.setBookAuthor();
        System.out.println(" Enter the Subject of Book  : ");
        this.setBookSubject();
        System.out.println(" Enter the Price of Book    : ");
        this.setBookPrice();
        System.out.println(" Enter Number of Copies     :");
        this.setNoOfCopies();

        FileOutputStream fos = null;
        ObjectOutputStream oos = null;

        try {
            fos = new FileOutputStream("Database.ser");
            oos = new ObjectOutputStream(fos);
            oos.flush();
            oos.writeObject(bookData);
            oos.close();
            fos.close();
        }catch(Exception e){
            System.out.println("Exception Caught: "+e);
        }

    }catch(IOException e){
        System.out.println("IO Exception Caught: "+e);
    }catch(Exception e){
        System.out.println("Exception Caught: "+e);
    }finally{
        try{
            File file = new File("Books_Index.txt");
            FileWriter fw = new FileWriter(file, true);
            int count=getObjCount();
            fw.write("\nBook Index ["+count+"] Contains Book Named: ["+getBookTitle()+"]");
            fw.close();
            //saveData();

        }catch(Exception e){
            System.out.println("Exception Caught: "+e);
        }
    }

}

我通过谷歌搜索并得到答案,因为您需要实现可序列化的接口。

我已经实现了。

可能是什么原因。我正在通过共享我的pastebin链接发送代码

链接:https://pastebin.com/Q8F3iwex

2 个答案:

答案 0 :(得分:0)

实现Serializable接口的类可以被序列化。 InputStreamReader和BufferedReader没有实现此接口。

快速解决方案是:

  protected transient InputStreamReader inputStream = new InputStreamReader(System.in);

  protected transient BufferedReader scan = new BufferedReader(inputStream);

答案 1 :(得分:0)

它在您序列化对象时递归地序列化对象中的每个对象,每个对象都必须可序列化。根据jdk中的源代码,对象是StringArrayEnumSerializable的实现可以序列化。

ObjectOutputStream中的源代码

        // remaining cases
        if (obj instanceof String) {
            writeString((String) obj, unshared);
        } else if (cl.isArray()) {
            writeArray(obj, desc, unshared);
        } else if (obj instanceof Enum) {
            writeEnum((Enum<?>) obj, desc, unshared);
        } else if (obj instanceof Serializable) {
            writeOrdinaryObject(obj, desc, unshared);
        } else {
            if (extendedDebugInfo) {
                throw new NotSerializableException(
                    cl.getName() + "\n" + debugInfoStack.toString());
            } else {
                throw new NotSerializableException(cl.getName());
            }
        }

在您的Library类中,有一个BufferedReader字段,无法序列化。 您可以尝试

transient BufferedReader scan = new BufferedReader(new InputStreamReader(System.in));

或者像这样实现自己的序列化逻辑:

private void writeObject(ObjectOutputStream out) throws IOException {
    //your own serialization logic
    .......
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
    //your own deserialization logic
    ........
}