在Java中查找不可序列化字段的好方法 [英] A good way to find unserializable fields in Java

查看:205
本文介绍了在Java中查找不可序列化字段的好方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个相当复杂的Java对象序列化(几个星期前工作正常)。同时执行了很多操作之后,序列化现在无法抛出以下异常:

  java.io.NotSerializableException:sun。 java2d.SunGraphics2D 

我检查了所有类似于相关的类,但是找不到字段他们持有一个Graphics2D类型(或类似的BufferedImage或类似的类型)。正如我所看到的,问题也可能是我正在使用一个类(从一个图书馆等)本身是可序列化的,但有一个字段的无法序列化的类型Graphics2D。


$ b $所以,我的问题是:是否有一个好的方式来找到序列化失败的地方?

预先感谢您

Lukas

p>

PS。这是异常的完整堆栈跟踪:

  java.io.NotSerializableException:sun.java2d.SunGraphics2D 
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
在java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
在java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java: (ObjectOutputStream.java:1432)
在java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
在java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
在java.io.ObjectOutputStream .writeArray(ObjectOutputStream.java:1378)
。在java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
。在java.io.ObjectOutputStream.access $ 300(ObjectOutputStream.java:162)
。在java.io.ObjectOutputStream中的$ PutFieldImpl.writeFields(ObjectOutputStream.java:1707)
在java.io.ObjectOutputStream.writeFields(ObjectOutputStream.java:482)
在java.awt.Container中.bjectObject(Container.java:3697)
at sun.reflect.GeneratedMethodAccessor17.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java在java.io.ObjectStreamClass.invokeWriteObject上的
(ObjectStreamClass.java:988)在java.io.ObjectOutputStream.writeSerialData上的
(ObjectOutputStream.java (ObjectOutputStream.java:1432)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
at java.io. ObjectOutputStream.writeArray(ObjectOutputStream.java:1378)
在java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)$ b $在java.io.ObjectOutputStream.access $ 300(ObjectOutputStream.java:162)
在java.io.ObjectOutputStream $ PutFieldImpl.writeFields(ObjectOutputStream.java:1707)
在java.io.ObjectOutputStream.writeFields(ObjectOu
at java.awt.Container.writeObject(Container.java:3697)
at sun.reflect.GeneratedMethodAccessor17.invoke(Unknown Source)
at sun.reflect。 DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:988)
在java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
在java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
在java.io.ObjectOutputStream.writeObject0 (ObjectOutputStream.java:1178)
在java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1378)
在java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
at java.io.ObjectOutputStream.access $ 300(ObjectOutputStream.java:162)
在java.io.ObjectOutputStream $ PutFieldImpl.writeFields(ObjectOutputStream.java:1707)
在java.io.ObjectOutputStream.writeFields(ObjectOutputStream.java:482)
at java.awt.Container.writeObject(Container.java:3697)
at sun.reflect.GeneratedMethodAccessor17.invoke(Unknown Source)在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
在java.lang.reflect.Method.invoke(Method.java:483)

在java.io.ObjectStreamClass中.invokeWriteObject(ObjectStreamClass.java:988)$ b $在java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
在java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
在java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
在java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1378)
在java.io.ObjectOutputStream.writeObject0(ObjectOutputStream。 java:1174)
在java.io.ObjectOutputStream.access $ 300(ObjectOutputStream.java:162)
在java.io.ObjectOutputStream $ PutFieldImpl .ObjectFields(ObjectOutputStream.java:1707)
在java.io.ObjectOutputStream.writeFields(ObjectOutputStream.java:482)
在java.awt.Container.writeObject(Container.java:3697)
在sun.reflect.GeneratedMethodAccessor17.invoke(未知源)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
在java.lang.reflect.Method.invoke(Method.java (ObjectOutputStream.java:1496)
at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:988)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496) ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)$ b $在java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
在java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
at java.awt.Window.writeObject(Window.java:2943)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeM ethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
在java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:988)
在java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
在java.io.ObjectOutputStream.writeOrdinaryObject (ObjectOutputStream.java:1432)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
at java.awt.AWTEventMulticaster.save(AWTEventMulticaster.java:946)
at java.awt.Window.writeObject(Window.java:2931)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Delega
at java.lang.reflect.Method.invoke(Method.java:483)
at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:988)
在java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
在java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
在java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java :在java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548 1178)
)在java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509

在java.io. ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
在java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
在java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
在java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
在java.io.ObjectOutputStream.writeOrdina ryObject(ObjectOutputStream.java:1432)
在java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
在java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
(Native方法)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)在java.util.LinkedList.writeObject(LinkedList.java:1131)
at sun.reflect.NativeMethodAccessorImpl.invoke0
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)$ b $ at java.lang.reflect.Method.invoke(Method.java:483)
at java.io.ObjectStreamClass .invokeWriteObject(ObjectStreamClass.java:988)$ b $在java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
在java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
在java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
在java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputS (ObjectOutputStream.java:1548)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
at java .io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
at eas.simulation.SerializableSimulationState.save(SerializableSimulationState.java:121 )
在eas.plugins.standard.visualization.ControlPanel.actionPerformed(ControlPanel.java:202)
处的javax javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
。在DefaultButtonModel.setPressed(DefaultButtonModel.java: 259)
在javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)$ b $ java.util.Component.processMouseEvent(Component.java:6527)$ b $ javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
java.awt.Component.processEvent(Component .java:6292)
at java.awt.Container.processEvent(Container.java:2234)
at java.awt.Component.dispatchEventImpl(Component.java:4883)
at java。 awt.Container.dispatchEventImpl(Container.java:2292)$ b $在java.awt.Component.dispatchEvent(Component.java:4705)
在java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4533)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462)
at java.awt.Container.dispatchEventImpl (Container.java:2278)
在java.awt.Component.dispatchEvent(Component.java:4705)
在java.awt.EventQueue.dispatchEventImpl(EventQueue.java:746)
at java.awt.EventQueue.access $ 400(EventQueue.java:97)
在java.awt.EventQueue $ 3.run(EventQueue.java:697)$ b $在java.awt.EventQueue $ 3.run(EventQueue.java:691)
在java.security.AccessController.doPrivileged(Native方法)在java.security.ProtectionDomain处
$ 1.doIntersectionPrivilege(ProtectionDomain.java:75)$ java.util.ProtectionDomain中的$ b $ $ $ 1.doIntersectionPrivilege(ProtectionDomain.java:86)$ b $ at java.awt .EventQueue $ 4.run(EventQueue.java:719)$ b $ at java.awt.EventQueue $ 4.run(EventQueue.java:717)$ b $ at java.security.AccessController.doPrivileged(Native Method)$ b在java.security.ProtectionDomain处为$ b $ 1.doIntersectionPrivilege(ProtectionDomain.java:75)$ b $在java.awt.EventQueue.dispatchEvent(EventQueue.java:716)
在java.awt.EventDispatchThread.pumpOneEventForFilters EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)$ b $ at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run (EventDispatchThread.java:82)


解决方案

被认为是正确的序列化,即声明所有不可序列化的字段为瞬态的,因此不应该是错误的来源。



如果你的代码使用了ContextedRuntimeExceptions,它们是上述规则的一个例外,因为它们引用的对象可能不是可序列化的,而且这是在Javadoc 中提到的方法addContextValue()和setContextValue()。如果上下文值是问题,这将解释为什么可疑类没有这样的字段获得对Graphics2D对象的引用。

我已经有限的成功复制NotSerializableException for SunGraphics2D没有留下一个明显的领域与图形的名字铺设,这可能是由于在一个更简单的类结构的测试。我发现,除了有争议的例外,集合是一个很好的嫌疑,但只有在使用原始类型的情况下。集合也可能导致间歇性故障,如果他们有时只填充图形。



根据您的应用程序,本Lawry的自动化解决方案类似的问题可能比手动寻找上述更容易实施。如果这条道路有效的话,它也可能会更彻底。你能得到一个堆栈跟踪?

I have a quite complex Java object to serialize (which worked fine a couple of weeks ago). After having implemented a lot in the meantime, the serialization now fails throwing the following exception:

java.io.NotSerializableException: sun.java2d.SunGraphics2D

I have inspected all classes which seemed relevant, but could not find a field in any of them holding a Graphics2D type (or a similar type such as BufferedImage or the like). As I see it, the problem could also be that I'm using a class (from a library or so) which itself is serializable, but has a field of the unserializable type Graphics2D.

So, my question is: is there a "good" way to find the place where the serialization fails? Inspecting all classes and all changes made seems to be hardly feasible.

Thank you in advance

Lukas

PS. Here is the full stack trace of the exception:

java.io.NotSerializableException: sun.java2d.SunGraphics2D
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1378)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
    at java.io.ObjectOutputStream.access$300(ObjectOutputStream.java:162)
    at java.io.ObjectOutputStream$PutFieldImpl.writeFields(ObjectOutputStream.java:1707)
    at java.io.ObjectOutputStream.writeFields(ObjectOutputStream.java:482)
    at java.awt.Container.writeObject(Container.java:3697)
    at sun.reflect.GeneratedMethodAccessor17.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:988)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1378)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
    at java.io.ObjectOutputStream.access$300(ObjectOutputStream.java:162)
    at java.io.ObjectOutputStream$PutFieldImpl.writeFields(ObjectOutputStream.java:1707)
    at java.io.ObjectOutputStream.writeFields(ObjectOutputStream.java:482)
    at java.awt.Container.writeObject(Container.java:3697)
    at sun.reflect.GeneratedMethodAccessor17.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:988)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1378)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
    at java.io.ObjectOutputStream.access$300(ObjectOutputStream.java:162)
    at java.io.ObjectOutputStream$PutFieldImpl.writeFields(ObjectOutputStream.java:1707)
    at java.io.ObjectOutputStream.writeFields(ObjectOutputStream.java:482)
    at java.awt.Container.writeObject(Container.java:3697)
    at sun.reflect.GeneratedMethodAccessor17.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:988)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1378)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
    at java.io.ObjectOutputStream.access$300(ObjectOutputStream.java:162)
    at java.io.ObjectOutputStream$PutFieldImpl.writeFields(ObjectOutputStream.java:1707)
    at java.io.ObjectOutputStream.writeFields(ObjectOutputStream.java:482)
    at java.awt.Container.writeObject(Container.java:3697)
    at sun.reflect.GeneratedMethodAccessor17.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:988)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
    at java.awt.Window.writeObject(Window.java:2943)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:988)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
    at java.awt.AWTEventMulticaster.save(AWTEventMulticaster.java:946)
    at java.awt.Window.writeObject(Window.java:2931)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:988)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
    at java.util.LinkedList.writeObject(LinkedList.java:1131)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:988)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
    at eas.simulation.SerializableSimulationState.save(SerializableSimulationState.java:121)
    at eas.plugins.standard.visualization.ControlPanel.actionPerformed(ControlPanel.java:202)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2346)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    at java.awt.Component.processMouseEvent(Component.java:6527)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
    at java.awt.Component.processEvent(Component.java:6292)
    at java.awt.Container.processEvent(Container.java:2234)
    at java.awt.Component.dispatchEventImpl(Component.java:4883)
    at java.awt.Container.dispatchEventImpl(Container.java:2292)
    at java.awt.Component.dispatchEvent(Component.java:4705)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4533)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462)
    at java.awt.Container.dispatchEventImpl(Container.java:2278)
    at java.awt.Component.dispatchEvent(Component.java:4705)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:746)
    at java.awt.EventQueue.access$400(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:697)
    at java.awt.EventQueue$3.run(EventQueue.java:691)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
    at java.awt.EventQueue$4.run(EventQueue.java:719)
    at java.awt.EventQueue$4.run(EventQueue.java:717)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:716)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

解决方案

The library class can be assumed to be correctly serializable, i.e. to declare all non-serializable fields as transient, and therefore shouldn't be the source of the error.

If your code is using ContextedRuntimeExceptions, they are an exception to the above rule because the objects they reference may not be serializable, and this is noted in the Javadoc at the methods addContextValue() and setContextValue(). If context values are the problem, it would explain why the suspect classes got a reference to a Graphics2D object without having such a field.

I have had limited success replicating NotSerializableException for SunGraphics2D without leaving an obvious field with "Graphics" in its name laying around, which could be due to testing on a simpler class structure. I found that in addition to contexted exceptions, collections were a good suspect but only if they used raw types. Collections could also cause intermittent failures if they were only sometimes populated with Graphics.

Depending on your application, Ben Lawry's automated solution to a similar issue may be easier to implement than manually hunting for the above. If that path works, it will likely be more thorough as well. Can you get a stack trace?

这篇关于在Java中查找不可序列化字段的好方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆