无法序列化 JavaScript 函数
Cannot serialize JavaScript function
我正在尝试更改我们的 XPages 应用程序中的页面持久性,打算从 "Keep pages in memory" 移动到 "Keep only the current page in memory"。当然,我收到 运行-time 错误,告诉我 XPages 无法序列化 JavaScript 函数。但是哪个函数呢?堆栈跟踪仅显示标准 Java 错误内容,但没有说明哪个变量或函数无法序列化?
我之前也遇到过类似的问题,总是花很多时间去深挖代码解决问题。这需要很长时间......我现在真的已经做到了。
有什么巧妙的方法可以找出哪个函数不能序列化吗??
更新
OpenLog Logger 的功能:
Client Version
Release 9.0.1FP3
January 12, 2015
Database aalto803.nsf
Agent /aASK.xsp
Method class java.lang.StackTraceElement.writeValue
Error Num -
Error Line 364
Error Msg Impossible de sérialiser une fonction JavaScript
Language Java
Stack Trace
java.io.IOException: Impossible de sérialiser une fonction JavaScript
at com.ibm.jscript.types.FBSValue.writeValue(FBSValue.java:364)
at com.ibm.jscript.types.FBSDefaultObject.writeExternal(FBSDefaultObject.java:746)
at com.ibm.jscript.std.ObjectObject.writeExternal(ObjectObject.java:106)
at java.io.ObjectOutputStream.writeExternalData(ObjectOutputStream.java:1462)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1179)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
at java.util.HashMap.writeObject(HashMap.java:942)
at sun.reflect.GeneratedMethodAccessor51.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
at java.lang.reflect.Method.invoke(Method.java:611)
at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1020)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1502)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1433)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1179)
at java.io.ObjectOutputStream.writeUnshared(ObjectOutputStream.java:413)
at com.ibm.xsp.application.AbstractSerializingStateManager$FastObjectOutputStream.writeObjectEx(AbstractSerializingStateManager.java:438)
at com.ibm.xsp.application.AbstractSerializingStateManager$FastObjectOutputStream.writeObjectEx(AbstractSerializingStateManager.java:417)
at com.ibm.xsp.application.AbstractSerializingStateManager$FastObjectOutputStream.writeObjectEx(AbstractSerializingStateManager.java:417)
at com.ibm.xsp.application.AbstractSerializingStateManager$FastObjectOutputStream.writeObjectEx(AbstractSerializingStateManager.java:417)
at com.ibm.xsp.application.AbstractSerializingStateManager$FastObjectOutputStream.writeObjectEx(AbstractSerializingStateManager.java:417)
at com.ibm.xsp.application.AbstractSerializingStateManager.saveSerializedView(AbstractSerializingStateManager.java:294)
at com.ibm.xsp.application.AbstractSerializingStateManager.doSaveSerializedView(AbstractSerializingStateManager.java:269)
at com.ibm.xsp.application.FileStateManager.doSaveSerializedView(FileStateManager.java:290)
at com.ibm.xsp.application.FileStateManager.doSaveSerializedView(FileStateManager.java:270)
at com.ibm.xsp.application.AbstractStateManager.saveSerializedView(AbstractStateManager.java:114)
at com.ibm.xsp.application.StateManagerImpl.saveSerializedView(StateManagerImpl.java:152)
at com.ibm.xsp.application.ViewHandlerExImpl._saveViewState(ViewHandlerExImpl.java:455)
at com.ibm.xsp.application.ViewHandlerExImpl.saveViewState(ViewHandlerExImpl.java:449)
at com.ibm.xsp.application.ViewHandlerExImpl._renderView(ViewHandlerExImpl.java:324)
at com.ibm.xsp.application.ViewHandlerExImpl.renderView(ViewHandlerExImpl.java:336)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:103)
XPages OpenLog Logger 不仅可以捕获未捕获的异常(听起来这就是其中之一),还可以捕获哪个组件触发了问题。它在应用程序中需要一个错误 XPage(否则在错误发生后没有 Render Response 阶段 运行,XPages OpenLog Logger 从中检索详细信息)。这可能会帮助您找到它。
否则,请检查您在 viewScope 等中存储了哪些函数。这可能会帮助您缩小范围。 SSJS 并不是真正为面向对象编程而设计的,我认为这是在作用域中存储函数时出现问题的地方。
您的问题的答案与其说是哪个函数不能序列化,不如说是您的 NONE 个函数可以序列化。或者,如果您想变得非常技术性,可以期望 none 以任何方式可靠地坚持下去。 SSJS 并不意味着被序列化。在此博客 post 此处:http://xomino.com/2014/03/26/why-learning-javascript-is-more-critical-to-xpage-developers-than-java/ 评论中有很好的讨论关于序列化为何和何处有毒,特别是对于 SSJS(您可以忽略围绕博客的实际讨论 post java 与 JavaScript - 只关注与序列化有关的位)。
我最近的一个发现也回答了这个问题恕我直言,请参阅 。几年前,我开始将我的代码从 SSJS 移动到 Java,我在 ObjectObject 和 ArrayObject classes 上遇到了一些(更好:很多)问题,主要是相当丑陋的方式必须使用名为 FBSUtility 的 class 转换值。
我的主要问题是无法在 ObjectObject 对象中存储日期。在稍后的阶段,我很高兴地发现了一个带有 JSContext 参数 FBSUtility.wrap(jsContext, someDate)
的调用,它允许存储日期值。说我一无所知,关于 JSContext 在这里实际做了什么(我就是),但我认为这就是它的结束。
最近,为了测试我们的应用程序,我改变了持久化模式,从内存中的几页到磁盘上的所有内容,因此强制所有对象的序列化。我发现我的应用程序的一个特定元素不再工作,总是因序列化错误而停止。进一步的测试证明,当我从 OO 对象中删除所有 Date 值时没有错误。
早些时候,我已经为应用程序的其他部分采用了 JsonJavaObject 和 JsonJavaArray classes(是的,我知道,混乱的编码,大应用程序,从来没有时间做正确的事情,50 Mb 模板数据库等)。我重写了代码以删除对 classes JSContext、FBSUtility、ObjectObject 和 ArrayObject 的所有使用,将它们替换为 JsonJava classes,并且不再有JS 函数无法序列化的可怕消息。
所以,我学到的是:如果您的持久化模式设置为 Keep pages on Disk
或 Keep only the current page in memory
,请尝试避免使用 ObjectObject 对象并且 从不 在中使用 FBSUtility结合 JSContext.
我正在尝试更改我们的 XPages 应用程序中的页面持久性,打算从 "Keep pages in memory" 移动到 "Keep only the current page in memory"。当然,我收到 运行-time 错误,告诉我 XPages 无法序列化 JavaScript 函数。但是哪个函数呢?堆栈跟踪仅显示标准 Java 错误内容,但没有说明哪个变量或函数无法序列化?
我之前也遇到过类似的问题,总是花很多时间去深挖代码解决问题。这需要很长时间......我现在真的已经做到了。
有什么巧妙的方法可以找出哪个函数不能序列化吗??
更新
OpenLog Logger 的功能:
Client Version
Release 9.0.1FP3
January 12, 2015
Database aalto803.nsf
Agent /aASK.xsp
Method class java.lang.StackTraceElement.writeValue
Error Num -
Error Line 364
Error Msg Impossible de sérialiser une fonction JavaScript
Language Java
Stack Trace
java.io.IOException: Impossible de sérialiser une fonction JavaScript
at com.ibm.jscript.types.FBSValue.writeValue(FBSValue.java:364)
at com.ibm.jscript.types.FBSDefaultObject.writeExternal(FBSDefaultObject.java:746)
at com.ibm.jscript.std.ObjectObject.writeExternal(ObjectObject.java:106)
at java.io.ObjectOutputStream.writeExternalData(ObjectOutputStream.java:1462)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1179)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
at java.util.HashMap.writeObject(HashMap.java:942)
at sun.reflect.GeneratedMethodAccessor51.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
at java.lang.reflect.Method.invoke(Method.java:611)
at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1020)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1502)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1433)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1179)
at java.io.ObjectOutputStream.writeUnshared(ObjectOutputStream.java:413)
at com.ibm.xsp.application.AbstractSerializingStateManager$FastObjectOutputStream.writeObjectEx(AbstractSerializingStateManager.java:438)
at com.ibm.xsp.application.AbstractSerializingStateManager$FastObjectOutputStream.writeObjectEx(AbstractSerializingStateManager.java:417)
at com.ibm.xsp.application.AbstractSerializingStateManager$FastObjectOutputStream.writeObjectEx(AbstractSerializingStateManager.java:417)
at com.ibm.xsp.application.AbstractSerializingStateManager$FastObjectOutputStream.writeObjectEx(AbstractSerializingStateManager.java:417)
at com.ibm.xsp.application.AbstractSerializingStateManager$FastObjectOutputStream.writeObjectEx(AbstractSerializingStateManager.java:417)
at com.ibm.xsp.application.AbstractSerializingStateManager.saveSerializedView(AbstractSerializingStateManager.java:294)
at com.ibm.xsp.application.AbstractSerializingStateManager.doSaveSerializedView(AbstractSerializingStateManager.java:269)
at com.ibm.xsp.application.FileStateManager.doSaveSerializedView(FileStateManager.java:290)
at com.ibm.xsp.application.FileStateManager.doSaveSerializedView(FileStateManager.java:270)
at com.ibm.xsp.application.AbstractStateManager.saveSerializedView(AbstractStateManager.java:114)
at com.ibm.xsp.application.StateManagerImpl.saveSerializedView(StateManagerImpl.java:152)
at com.ibm.xsp.application.ViewHandlerExImpl._saveViewState(ViewHandlerExImpl.java:455)
at com.ibm.xsp.application.ViewHandlerExImpl.saveViewState(ViewHandlerExImpl.java:449)
at com.ibm.xsp.application.ViewHandlerExImpl._renderView(ViewHandlerExImpl.java:324)
at com.ibm.xsp.application.ViewHandlerExImpl.renderView(ViewHandlerExImpl.java:336)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:103)
XPages OpenLog Logger 不仅可以捕获未捕获的异常(听起来这就是其中之一),还可以捕获哪个组件触发了问题。它在应用程序中需要一个错误 XPage(否则在错误发生后没有 Render Response 阶段 运行,XPages OpenLog Logger 从中检索详细信息)。这可能会帮助您找到它。
否则,请检查您在 viewScope 等中存储了哪些函数。这可能会帮助您缩小范围。 SSJS 并不是真正为面向对象编程而设计的,我认为这是在作用域中存储函数时出现问题的地方。
您的问题的答案与其说是哪个函数不能序列化,不如说是您的 NONE 个函数可以序列化。或者,如果您想变得非常技术性,可以期望 none 以任何方式可靠地坚持下去。 SSJS 并不意味着被序列化。在此博客 post 此处:http://xomino.com/2014/03/26/why-learning-javascript-is-more-critical-to-xpage-developers-than-java/ 评论中有很好的讨论关于序列化为何和何处有毒,特别是对于 SSJS(您可以忽略围绕博客的实际讨论 post java 与 JavaScript - 只关注与序列化有关的位)。
我最近的一个发现也回答了这个问题恕我直言,请参阅
我的主要问题是无法在 ObjectObject 对象中存储日期。在稍后的阶段,我很高兴地发现了一个带有 JSContext 参数 FBSUtility.wrap(jsContext, someDate)
的调用,它允许存储日期值。说我一无所知,关于 JSContext 在这里实际做了什么(我就是),但我认为这就是它的结束。
最近,为了测试我们的应用程序,我改变了持久化模式,从内存中的几页到磁盘上的所有内容,因此强制所有对象的序列化。我发现我的应用程序的一个特定元素不再工作,总是因序列化错误而停止。进一步的测试证明,当我从 OO 对象中删除所有 Date 值时没有错误。
早些时候,我已经为应用程序的其他部分采用了 JsonJavaObject 和 JsonJavaArray classes(是的,我知道,混乱的编码,大应用程序,从来没有时间做正确的事情,50 Mb 模板数据库等)。我重写了代码以删除对 classes JSContext、FBSUtility、ObjectObject 和 ArrayObject 的所有使用,将它们替换为 JsonJava classes,并且不再有JS 函数无法序列化的可怕消息。
所以,我学到的是:如果您的持久化模式设置为 Keep pages on Disk
或 Keep only the current page in memory
,请尝试避免使用 ObjectObject 对象并且 从不 在中使用 FBSUtility结合 JSContext.