【发布时间】:2014-01-17 02:54:46
【问题描述】:
在使用 HtmlUnit-2.13 执行在 HTML 标记上注入样式属性的 JavaScript 函数后,我们无法序列化生成的 HtmlPage,并且收到以下错误:
java.io.NotSerializableException:com.gargoylesoftware.htmlunit.javascript.host.css.CSSStyleDeclaration$StyleElement
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at java.util.HashMap.writeObject(Unknown Source)
at sun.reflect.GeneratedMethodAccessor6.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)
如果样式属性在Page上且没有注入,则页面可以序列化,没有任何问题。
2013 年 4 月 12 日更新:
我发现问题出在这个字段:
私有地图
styleMap_ ;
它是 CSSStyleDeclaration 类的成员。 StyleElement 类没有实现 Serializable 接口。
最初,该字段等于null,没有问题发生。但是,一旦执行了 JavaScript 事件,Map 就不再指向 null 并且正在抛出异常。
我做错了吗?该字段应该始终为空,或者之前没有人尝试过序列化该类?
【问题讨论】:
-
你到底是如何序列化页面的?
-
我使用下面的sn-p:
ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutput out = null; try { out = new ObjectOutputStream(bos); out.writeObject(page); } catch (Exception ex) { ex.printStackTrace(System.out); } finally { out.close(); bos.close(); } return bos.toByteArray();
标签: javascript css htmlunit serializable