2013-04-03 75 views
0

我一直在努力解决在Java中保存和加载对象,但我在加载文件时遇到了一些问题。我想在这里做的是加载一个名为Employee的对象的ArrayList,我已经序列化了它。当我尝试加载时,我仍然遇到了红墙错误。我究竟做错了什么?这里是我的代码:从文件加载对象的ArrayList

try (FileInputStream filStrom = new FileInputStream(filpeker); 
         ObjectInputStream objektStrom = new ObjectInputStream(filStrom)) 
        { 
        employeelist = (ArrayList<Employee>)objektStrom.readObject(); 
        objektStrom.close(); 
       } catch (IOException | ClassNotFoundException e) { 
        JOptionPane.showMessageDialog(null, "Feil under lesing av fil! " + e.getMessage()); 
        e.printStackTrace(); 
       } 

我得到的错误是这些:

java.io.InvalidClassException: ovinger9.Employee; no valid constructor 
at java.io.ObjectStreamClass$ExceptionInfo.newInvalidClassException(Unknown Source) 
at java.io.ObjectStreamClass.checkDeserialize(Unknown Source) 
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source) 
at java.io.ObjectInputStream.readObject0(Unknown Source) 
at java.io.ObjectInputStream.readObject(Unknown Source) 
at java.util.ArrayList.readObject(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.invokeReadObject(Unknown Source) 
at java.io.ObjectInputStream.readSerialData(Unknown Source) 
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source) 
at java.io.ObjectInputStream.readObject0(Unknown Source) 
at java.io.ObjectInputStream.readObject(Unknown Source) 
at ovinger9.EmployeeGUI$2.actionPerformed(EmployeeGUI.java:135) 
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) 
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) 
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) 
at javax.swing.DefaultButtonModel.setPressed(Unknown Source) 
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) 
at java.awt.Component.processMouseEvent(Unknown Source) 
at javax.swing.JComponent.processMouseEvent(Unknown Source) 
at java.awt.Component.processEvent(Unknown Source) 
at java.awt.Container.processEvent(Unknown Source) 
at java.awt.Component.dispatchEventImpl(Unknown Source) 
at java.awt.Container.dispatchEventImpl(Unknown Source) 
at java.awt.Component.dispatchEvent(Unknown Source) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) 
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) 
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) 
at java.awt.Container.dispatchEventImpl(Unknown Source) 
at java.awt.Window.dispatchEventImpl(Unknown Source) 
at java.awt.Component.dispatchEvent(Unknown Source) 
at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
at java.awt.EventQueue.access$200(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue$4.run(Unknown Source) 
at java.awt.EventQueue$4.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue.dispatchEvent(Unknown Source) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.run(Unknown Source) 
+2

对我来说看起来很清楚:'ovinger9.Employee'; ***没有有效的构造函数*** – 2013-04-03 20:06:59

+0

@JimGarrison ... newInvalidClassException ... – Ihsan 2013-04-03 20:07:57

+0

在'Employee'类中确保您有默认的构造函数,同时请注意,如果您有重载的构造函数,那么您必须明确地添加默认的构造函数。 – tmwanik 2013-04-03 20:09:44

回答

3

添加公共构造不带任何参数的ovinger9.Employee类(除了你已经有另一个构造函数) 。

+0

+1对于敏锐的眼睛和美好的回忆...... – Ihsan 2013-04-03 20:10:26

1

如果Employee类扩展的类不是Serializable,并且超类没有零参数构造方法,可能会发生这种情况,如java.io.Serializable文档中所述。要解决它,要么声明你的超类为Serializable,要么向超类添加一个零参数构造函数。

+0

我想出了你的建议谢谢!我完全忘记了我没有序列化过的Employee的超类。 – user2013333 2013-04-03 20:29:54