我无法将序列化对象写入文件。我的保存例程总是在ObjectOutput.writeObject(..)
失败我有一个Inventory类,它包含一个链接的项目列表。 MainView是程序的主要JFrame,它还包含Inventory对象。
我之前有过这个工作,但我决定重写我的绝大多数程序。看来我已经做了一些事情搞砸了但是我无法弄清楚是什么。
如果您需要更多代码,请告诉我,但我认为这涵盖了所有内容。
项目类
import java.io.Serializable;
public class Item implements Serializable
{
private static final long serialVersionUID = 1L;
private String m_sItemNumber;
public String getItemNumber(){return m_sItemNumber;}
public void setItemNumber(String newVal){m_sItemNumber = newVal;}
public void setDefaults()
{
m_sItemNumber = "notset";
}
}
库存类
import java.io.Serializable;
import java.util.LinkedList;
public class Inventory implements Serializable
{
private static final long serialVersionUID = 1L;
MainView mainView;
LinkedList<Item> Inventory = new LinkedList<>();
int indexOfCurrentItem;
public void setMainView(MainView view)
{
mainView = view;
}
public boolean addItem(Item it)
{
Inventory.add(it);
return true;
}
public Item getCurrentItem()
{
return Inventory.get(indexOfCurrentItem);
}
public Item getItemByIndex(int index)
{
return Inventory.get(index);
}
}
IOHandler串口保存功能
public boolean saveSerialInv(String arg)
{
loadSaveDialog.newStatusLine(" Starting Inventory Save");
ObjectOutput out = null;
try
{
out = new ObjectOutputStream(new FileOutputStream(arg));
}
catch (FileNotFoundException e)
{
loadSaveDialog.newStatusLine(" Could Not Create File");
return false;
}
catch (IOException e)
{
mainView.newStatusLine(" IO File save Exception");
return false;
}
try
{
out.writeObject(mainView.inventoryOfItems); // !! Fails here. !!
}
catch (IOException e)
{
loadSaveDialog.newStatusLine(" IO Write-- Exception");
try
{
out.close();
}
catch (IOException e1)
{
loadSaveDialog.newStatusLine(" IO Close save file Exception");
return false;
}
return false;
}
try
{
out.close();
}
catch (IOException e)
{
loadSaveDialog.newStatusLine(" IO Close save file Exception");
return false;
}
return true;
}
MainView类
public class MainView extends javax.swing.JFrame
{
static LoadSaveDialog loadSave = new LoadSaveDialog();
static ItemInfoDialog itemInfo = new ItemInfoDialog();
Inventory inventoryOfItems = new Inventory();
boolean invLoaded = false;
public MainView()
{
initComponents();
loadSave.setMainView(this);
inventoryOfItems.setMainView(this);
}
}
答案 0 :(得分:2)
序列化的一般规则是,您班级中的所有属性都应为serializable
或标记为transient
。没有关于MainView类的信息是否可序列化,如果没有,则标记为瞬态。
MainView mainView;
您的任何非序列化属性都无法读取/写入对象流。因此,这将失败:
out.writeObject(mainView.inventoryOfItems); // !! Fails here. !!