我之前从未使用过序列化。我认为除了我的“Q”案例切换的最后一部分之外我没有用。
public class Test{
public static void main(String args[]){
Store store = new Store();
FileOutputStream fos;
ObjectOutputStream oos = null;
try{
fos = new FileOutputStream(new File("table.obj"));
oos = new ObjectOutputStream(fos);
}catch(IOException e1){
e1.printStackTrace();
}
这继续包含更多代码,但我认为非常重要的是我的“Q”案例......
case "Q":
System.out.println("Good-Bye!");
try{
oos.writeObject(store);
oos.flush();
oos.close();
}catch(IOException e){
e.printStackTrace();
}
System.exit(0);
break;
当我尝试将所有数据保存到我的.obj文件并关闭流并退出程序时,我得到所有这些错误......
java.io.NotSerializableException:Item at java.io.ObjectOutputStream.writeObject0(Unknown Source) at java.io.ObjectOutputStream.writeObject(Unknown Source) at java.util.Hashtable.writeObject(Unknown Source) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at java.io.ObjectStreamClass.invokeWriteObject(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.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) 在Test.main(Test.java:143)
我不确定这些错误大多数意味着什么,或者我为什么会得到它们,甚至不知道如何修复它们。任何人都可以帮助我吗?
编辑:商店课程
import java.io.Serializable;
import java.util.Hashtable;
public class Store implements Serializable{
Hashtable<String, Item> stockedItems = new Hashtable<String, Item>();
public boolean addItem(String code){
if(stockedItems.containsKey(code)){
stockedItems.get(code).incrementQuantity();
return true;
}
return false;
}
public boolean removeItem(String code){
if(stockedItems.containsKey(code)){
stockedItems.get(code).decrementQuantity();
return true;
}
return false;
}
public boolean findItem(String code){
if(stockedItems.containsKey(code)){
return true;
}
return false;
}
}
**我的HashTable包含不实现Serializable的Item对象。我现在修复了哪个。程序运行和Q案例工作正常!现在,这是我的U案不起作用,这里是......
case "U":
try{
FileInputStream fis = new FileInputStream("table.obj");
ObjectInputStream ois = new ObjectInputStream(fis);
store = (Store)ois.readObject();
ois.close();
}catch(IOException | ClassNotFoundException e){
e.printStackTrace();
}
break;
此案例的目的是允许用户选择是否要使用存储在我的.obj文件中的数据。我试图使用那个案例时遇到这些错误
java.io.ObjectInputStream中的$ BlockDataInputStream.peekByte(未知来源) at java.io.ObjectInputStream.readObject0(Unknown Source) at java.io.ObjectInputStream.readObject(Unknown Source) 在Test.main(Test.java:142)
答案 0 :(得分:10)
即使Hashtable
对象是可序列化的,您在 中存储的对象也必须是可序列化的。所以我首先检查一下你Hashtable
中存储的内容是否实现了Serializable
接口。至少,您的Store
课程还应该实现Serializable
界面。
<强>更新强>
根据您更新的问题,Item
类似乎也需要实现Serializable
。事实上,这正是异常的第一行所说的:
java.io.NotSerializableException: Item
答案 1 :(得分:1)
您只能编写Serializable
的对象,并且可以查找Oracle的JavaDoc并了解详细信息。
通常,在大多数情况下,您会将implements Serializable
添加到满足一些要求的任何类中。
一个类必须只有自己的Serializable对象或某些原始类型的字段,如int
或char
等。
如果存在某些超类型的字段,则占用该字段的对象实例必须是可序列化的,即使超类型不是。
还有更多内容。
答案 2 :(得分:1)
“java.io.NotSerializableException:Item”表示class Item
不可序列化。它需要是可序列化的,因为地图的内容需要可序列化,以使整个地图可序列化。