不相关的java.io.NotSerializableException始终引用相同的代码行

时间:2013-12-09 23:39:16

标签: java swing serialization drag-and-drop

今晚,当我拖放一个功能非常好的项目时,我会继续收到数千个这样的错误。我有140个课程,我无法追踪我所做的所有修改:(但我从来没有改变任何与拖放功能相关的东西。我已经完全远离代码中的行抛出这些例外。 这是导致异常的代码的一部分:

Object obj = ts.getTransferable().getTransferData(TransferableProductJob.PRODUCTJOB_DATA_FLAVOR);

我已经从stackTrace的这一行跟踪了它:

at View.panels.WaitingListJPanel$JListTransferHandler.importData(WaitingListJPanel.java:209)

完整的堆栈跟踪是:

dic 10, 2013 12:21:45 AM View.panels.WaitingListJPanel$JListTransferHandler importData
SEVERE: null
java.io.NotSerializableException: View.panels.BarsJPanel$1
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1180)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
    at java.util.ArrayList.writeObject(ArrayList.java:710)
    at sun.reflect.GeneratedMethodAccessor3.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:975)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1480)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1528)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1493)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1528)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1493)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
    at sun.awt.datatransfer.TransferableProxy.getTransferData(TransferableProxy.java:83)
    at java.awt.dnd.DropTargetContext$TransferableProxy.getTransferData(DropTargetContext.java:376)
    at View.panels.WaitingListJPanel$JListTransferHandler.importData(WaitingListJPanel.java:209)
    at javax.swing.TransferHandler$DropHandler.drop(TransferHandler.java:1536)
    at java.awt.dnd.DropTarget.drop(DropTarget.java:450)
    at javax.swing.TransferHandler$SwingDropTarget.drop(TransferHandler.java:1274)
    at sun.awt.dnd.SunDropTargetContextPeer.processDropMessage(SunDropTargetContextPeer.java:537)
    at sun.awt.dnd.SunDropTargetContextPeer$EventDispatcher.dispatchDropEvent(SunDropTargetContextPeer.java:851)
    at sun.awt.dnd.SunDropTargetContextPeer$EventDispatcher.dispatchEvent(SunDropTargetContextPeer.java:775)
    at sun.awt.dnd.SunDropTargetEvent.dispatch(SunDropTargetEvent.java:48)
    at java.awt.Component.dispatchEventImpl(Component.java:4716)
    at java.awt.Container.dispatchEventImpl(Container.java:2287)
    at java.awt.Component.dispatchEvent(Component.java:4687)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
    at java.awt.LightweightDispatcher.processDropTargetEvent(Container.java:4566)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4417)
    at java.awt.Container.dispatchEventImpl(Container.java:2273)
    at java.awt.Window.dispatchEventImpl(Window.java:2719)
    at java.awt.Component.dispatchEvent(Component.java:4687)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:723)
    at java.awt.EventQueue.access$200(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:682)
    at java.awt.EventQueue$3.run(EventQueue.java:680)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
    at java.awt.EventQueue$4.run(EventQueue.java:696)
    at java.awt.EventQueue$4.run(EventQueue.java:694)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:693)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)

我的尝试:

  • 我制作了所有类别的引用 异常瞬态或我使它们成为Serializable的子类。(也许 它完成了40多个课程)
  • 有时候我会犯一个错误 说不是有效的类构造函数,在这种情况下我添加了一个 protected default constructor。所以我继续拥有上述内容 其他课程的例外情况。
  • 新的尝试:我试图删除barJPanel和所有相关的类我看到异常消失,但DnD已停止工作。这非常令人伤心,因为我没有更改DnD部分中的任何代码。我认为在某些类中使用默认构造函数创建新对象时很愚蠢。我的构造函数很复杂,我想知道Java是如何只使用默认构造函数来操作类的。

顺便说一下。

  1. 我的应用中的所有可序列化类都有自己的类 的serialVersionUID
  2. 我从不在整个应用程序中直接或间接使用与序列化相关的任何内容。所以不要问我的代码。这都是JVM。
  3. 主要的问题是我无法继续我的尝试,因为BarsJPanel是可序列化的,因为它是JPanel的子类并使其瞬态不会解决任何问题。


    添加匿名类代码:(GalvanicMachine可序列化)

        galvanicMachine.addProductJobsListener(new IProductJobsListener() {
    
            @Override
            public void productJobAdded(ProductJob pj) {
                SwingUtilities.invokeLater(new Runnable() {
    
                    @Override
                    public void run() {
                        reconstructPanelMap();
                    }
                });             
            }
    
            @Override
            public void productJobRemoved(ProductJob pj) {
                SwingUtilities.invokeLater(new Runnable() {
    
                    @Override
                    public void run() {
                        reconstructPanelMap();
                    }
                });
            }
        });
    

1 个答案:

答案 0 :(得分:1)

GalvanicMachine有一个成员集合,用于存储对IProductJobsListener的匿名实现实例的引用。存储这些引用的集合必须为transient,或者实现实例必须为Serializable

ActionListener不是JButton的(子类)的实例,包含在 JButton中。序列化ActionListener

没有多大意义