我正在努力实现以下目标...
我有一个class类型的ArrayList,用于存储类对象
每次存储新对象时,我都会对其进行序列化并清除以前的对象。
我有添加搜索删除等方法。
当我尝试添加时,我得到了异常,
捕获到的异常: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链接发送代码
答案 0 :(得分:0)
实现Serializable接口的类可以被序列化。 InputStreamReader和BufferedReader没有实现此接口。
快速解决方案是:
protected transient InputStreamReader inputStream = new InputStreamReader(System.in);
protected transient BufferedReader scan = new BufferedReader(inputStream);
答案 1 :(得分:0)
它在您序列化对象时递归地序列化对象中的每个对象,每个对象都必须可序列化。根据jdk中的源代码,对象是String
,Array
,Enum
或Serializable
的实现可以序列化。
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
........
}