Serialization 使Jackson ObjectMapper可序列化

Serialization 使Jackson ObjectMapper可序列化,serialization,wicket,jackson,Serialization,Wicket,Jackson,我想在Wicket中使用Jackson的ObjectMapper。它在一般情况下工作,但引发序列化异常:[class=org.codehaus.jackson.map.ObjectMapper]ObjectMapper不应序列化。它是不可序列化的,这是有充分理由的 因此,您还有一些与您的使用相关的问题:正如其他人所指出的,没有理由认为序列化或缺少ObjectMapper会导致问题。 最有可能的情况是,您意外地依赖于Mapper或类似的工具:删除这些依赖项。映射器通常以静态单例的形式访问(这很好)

我想在Wicket中使用Jackson的ObjectMapper。它在一般情况下工作,但引发序列化异常:
[class=org.codehaus.jackson.map.ObjectMapper]
ObjectMapper
不应序列化。它是不可序列化的,这是有充分理由的

因此,您还有一些与您的使用相关的问题:正如其他人所指出的,没有理由认为序列化或缺少
ObjectMapper
会导致问题。 最有可能的情况是,您意外地依赖于Mapper或类似的工具:删除这些依赖项。映射器通常以静态单例的形式访问(这很好),或者使用Guice或springioc之类的东西进行注入

基于最初的问题,您可能只需要创建一个
ObjectMapper
的静态实例——重要的是不要为每个请求创建新实例,而是重用实例


EDIT(2013/10):正如@Jason所指出的,
ObjectMapper
,这不再是事实。事实证明,有一个潜在的原因,当在某些平台上使用时——例如,在Android上,“冻结”映射器的能力可能是性能的胜利。我不建议将其作为默认策略,但至少是一个选项。

ObjectMapper
不应序列化。它是不可序列化的,这是有充分理由的

因此,您还有一些与您的使用相关的问题:正如其他人所指出的,没有理由认为序列化或缺少
ObjectMapper
会导致问题。 最有可能的情况是,您意外地依赖于Mapper或类似的工具:删除这些依赖项。映射器通常以静态单例的形式访问(这很好),或者使用Guice或springioc之类的东西进行注入

基于最初的问题,您可能只需要创建一个
ObjectMapper
的静态实例——重要的是不要为每个请求创建新实例,而是重用实例



EDIT(2013/10):正如@Jason所指出的,
ObjectMapper
,这不再是事实。事实证明,有一个潜在的原因,当在某些平台上使用时——例如,在Android上,“冻结”映射器的能力可能是性能的胜利。我不建议将其作为默认策略,但至少是一个选项。

这似乎是在尝试序列化
ObjectMapper
本身。为什么要这样做?在我的理解中,
mapper
需要序列化,但不是。所以我想让它可以序列化。或者这甚至是错误的方法?
ObjectMapper
用于序列化其他对象。为什么您认为需要在这里序列化它?好的,我已经在上面添加了完整的堆栈跟踪。我假设我需要序列化它,因为
无法序列化class:org.codehaus.jackson.map.ObjectMapper
。如果不是这样,我需要序列化什么?您有一个类。该类有一个字段,该字段是
对象映射器
ObjectMapper
不是用来序列化的,而是用来序列化其他对象的。为什么要尝试序列化包含
ObjectMapper
的类?这似乎是在尝试序列化
ObjectMapper
本身。为什么要这样做?在我的理解中,
mapper
需要序列化,但不是。所以我想让它可以序列化。或者这甚至是错误的方法?
ObjectMapper
用于序列化其他对象。为什么您认为需要在这里序列化它?好的,我已经在上面添加了完整的堆栈跟踪。我假设我需要序列化它,因为
无法序列化class:org.codehaus.jackson.map.ObjectMapper
。如果不是这样,我需要序列化什么?您有一个类。该类有一个字段,该字段是
对象映射器
ObjectMapper
不是用来序列化的,而是用来序列化其他对象的。为什么要尝试序列化包含
ObjectMapper
的类?这是因为创建新实例的成本很高?我还尝试了final static,但这对序列化异常没有帮助。我目前的解决方案是——或者说是完全错误的?创建并不昂贵,但您将为所有内容承担沉重的首次使用成本:mapper是缓存所有必要部分的东西。所以它将比重用实例慢10-100倍。静态成员应该可以工作(您已经有了静态记录器)。您还可以尝试添加关键字“transient”,因为transient条目没有序列化。愚蠢的me-
private static final transient
。谢谢实际上,从2.1开始,ObjectMapper是可序列化的,这是因为创建新实例的成本很高?我还尝试了final static,但这对序列化异常没有帮助。我目前的解决方案是——或者说是完全错误的?创建并不昂贵,但您将为所有内容承担沉重的首次使用成本:mapper是缓存所有必要部分的东西。所以它将比重用实例慢10-100倍。静态成员应该可以工作(您已经有了静态记录器)。您还可以尝试添加关键字“transient”,因为transient条目没有序列化。愚蠢的me-
private static final transient
。谢谢实际上,从2.1开始,ObjectMapper是可序列化的
*ERROR:Error serializing object class ....web.backend.overview.OverviewPage [object=[Page class = ....web.backend.overview.OverviewPage, id = 1, render count = 1]]
org.apache.wicket.util.io.SerializableChecker$WicketNotSerializableException: Unable to serialize class: org.codehaus.jackson.map.ObjectMapper
Field hierarchy is:
  1 [class=....web.backend.overview.OverviewPage, path=1]
    private java.lang.Object org.apache.wicket.MarkupContainer.children [class=[Ljava.lang.Object;]
      private org.apache.velocity.app.VelocityEngine ....web.BasePanel.velocityEngine[5] [class=....web.backend.overview.MailBoxQuickOverViewPanel, path=1:mailboxQuickOverviewPanel]
        private java.lang.Object org.apache.wicket.MarkupContainer.children [class=[Ljava.lang.Object;]
          private java.lang.Object org.apache.wicket.MarkupContainer.children[0] [class=....web.backend.overview.ChartPanel, path=1:mailboxQuickOverviewPanel:chartPanel]
            private java.lang.Object org.apache.wicket.MarkupContainer.children [class=com.comsysto.insight.component.HighchartsPanel, path=1:mailboxQuickOverviewPanel:chartPanel:chart]
              private java.lang.Object org.apache.wicket.MarkupContainer.children [class=[Ljava.lang.Object;]
                private java.lang.Object org.apache.wicket.MarkupContainer.children[1] [class=org.apache.wicket.markup.html.basic.Label, path=1:mailboxQuickOverviewPanel:chartPanel:chart:script]
                  java.lang.Object org.apache.wicket.Component.data [class=com.comsysto.insight.component.HighchartsPanel$1]
                    final com.comsysto.insight.model.Highchart com.comsysto.insight.component.HighchartsPanel$1.val$highcharts [class=com.comsysto.insight.model.Highchart]
                      private org.codehaus.jackson.map.ObjectMapper com.comsysto.insight.model.Highchart.mapper [class=org.codehaus.jackson.map.ObjectMapper] <----- field that is not serializable
    at org.apache.wicket.util.io.SerializableChecker.internalCheck(SerializableChecker.java:386) ~[wicket-core-1.5.4.jar:1.5.4]
    at org.apache.wicket.util.io.SerializableChecker.check(SerializableChecker.java:365) ~[wicket-core-1.5.4.jar:1.5.4]
    at org.apache.wicket.util.io.SerializableChecker.checkFields(SerializableChecker.java:646) ~[wicket-core-1.5.4.jar:1.5.4]
    at org.apache.wicket.util.io.SerializableChecker.internalCheck(SerializableChecker.java:569) ~[wicket-core-1.5.4.jar:1.5.4]
    at org.apache.wicket.util.io.SerializableChecker.check(SerializableChecker.java:365) ~[wicket-core-1.5.4.jar:1.5.4]
    at org.apache.wicket.util.io.SerializableChecker.checkFields(SerializableChecker.java:646) ~[wicket-core-1.5.4.jar:1.5.4]
    at org.apache.wicket.util.io.SerializableChecker.internalCheck(SerializableChecker.java:569) ~[wicket-core-1.5.4.jar:1.5.4]
    at org.apache.wicket.util.io.SerializableChecker.check(SerializableChecker.java:365) ~[wicket-core-1.5.4.jar:1.5.4]
    at org.apache.wicket.util.io.SerializableChecker.checkFields(SerializableChecker.java:646) ~[wicket-core-1.5.4.jar:1.5.4]
    at org.apache.wicket.util.io.SerializableChecker.internalCheck(SerializableChecker.java:569) ~[wicket-core-1.5.4.jar:1.5.4]
    at org.apache.wicket.util.io.SerializableChecker.check(SerializableChecker.java:365) ~[wicket-core-1.5.4.jar:1.5.4]
    at org.apache.wicket.util.io.SerializableChecker.internalCheck(SerializableChecker.java:431) ~[wicket-core-1.5.4.jar:1.5.4]
    at org.apache.wicket.util.io.SerializableChecker.check(SerializableChecker.java:365) ~[wicket-core-1.5.4.jar:1.5.4]
    at org.apache.wicket.util.io.SerializableChecker.checkFields(SerializableChecker.java:646) ~[wicket-core-1.5.4.jar:1.5.4]
    at org.apache.wicket.util.io.SerializableChecker.internalCheck(SerializableChecker.java:569) ~[wicket-core-1.5.4.jar:1.5.4]
    at org.apache.wicket.util.io.SerializableChecker.check(SerializableChecker.java:365) ~[wicket-core-1.5.4.jar:1.5.4]
    at org.apache.wicket.util.io.SerializableChecker.checkFields(SerializableChecker.java:646) ~[wicket-core-1.5.4.jar:1.5.4]
    at org.apache.wicket.util.io.SerializableChecker.internalCheck(SerializableChecker.java:569) ~[wicket-core-1.5.4.jar:1.5.4]
    at org.apache.wicket.util.io.SerializableChecker.check(SerializableChecker.java:365) ~[wicket-core-1.5.4.jar:1.5.4]
    at org.apache.wicket.util.io.SerializableChecker.internalCheck(SerializableChecker.java:431) ~[wicket-core-1.5.4.jar:1.5.4]
    at org.apache.wicket.util.io.SerializableChecker.check(SerializableChecker.java:365) ~[wicket-core-1.5.4.jar:1.5.4]
    at org.apache.wicket.util.io.SerializableChecker.checkFields(SerializableChecker.java:646) ~[wicket-core-1.5.4.jar:1.5.4]
    at org.apache.wicket.util.io.SerializableChecker.internalCheck(SerializableChecker.java:569) ~[wicket-core-1.5.4.jar:1.5.4]
    at org.apache.wicket.util.io.SerializableChecker.check(SerializableChecker.java:365) ~[wicket-core-1.5.4.jar:1.5.4]
    at org.apache.wicket.util.io.SerializableChecker.internalCheck(SerializableChecker.java:431) ~[wicket-core-1.5.4.jar:1.5.4]
    at org.apache.wicket.util.io.SerializableChecker.check(SerializableChecker.java:365) ~[wicket-core-1.5.4.jar:1.5.4]
    at org.apache.wicket.util.io.SerializableChecker.checkFields(SerializableChecker.java:646) ~[wicket-core-1.5.4.jar:1.5.4]
    at org.apache.wicket.util.io.SerializableChecker.internalCheck(SerializableChecker.java:569) ~[wicket-core-1.5.4.jar:1.5.4]
    at org.apache.wicket.util.io.SerializableChecker.check(SerializableChecker.java:365) ~[wicket-core-1.5.4.jar:1.5.4]
    at org.apache.wicket.util.io.SerializableChecker.writeObjectOverride(SerializableChecker.java:715) ~[wicket-core-1.5.4.jar:1.5.4]
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326) ~[na:1.6.0_29]
    at org.apache.wicket.serialize.java.JavaSerializer$CheckerObjectOutputStream.writeObjectOverride(JavaSerializer.java:258) ~[wicket-core-1.5.4.jar:1.5.4]
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326) ~[na:1.6.0_29]
    at org.apache.wicket.serialize.java.JavaSerializer.serialize(JavaSerializer.java:77) ~[wicket-core-1.5.4.jar:1.5.4]
    at org.apache.wicket.pageStore.DefaultPageStore.serializePage(DefaultPageStore.java:368) [wicket-core-1.5.4.jar:1.5.4]
    at org.apache.wicket.pageStore.DefaultPageStore.storePage(DefaultPageStore.java:146) [wicket-core-1.5.4.jar:1.5.4]
    at org.apache.wicket.page.PageStoreManager$PersistentRequestAdapter.storeTouchedPages(PageStoreManager.java:383) [wicket-core-1.5.4.jar:1.5.4]
    at org.apache.wicket.page.RequestAdapter.commitRequest(RequestAdapter.java:171) [wicket-core-1.5.4.jar:1.5.4]
    at org.apache.wicket.page.AbstractPageManager.commitRequest(AbstractPageManager.java:94) [wicket-core-1.5.4.jar:1.5.4]
    at org.apache.wicket.page.PageManagerDecorator.commitRequest(PageManagerDecorator.java:68) [wicket-core-1.5.4.jar:1.5.4]
    at org.apache.wicket.page.PageAccessSynchronizer$2.commitRequest(PageAccessSynchronizer.java:281) [wicket-core-1.5.4.jar:1.5.4]
    at org.apache.wicket.Application$2.onDetach(Application.java:1598) [wicket-core-1.5.4.jar:1.5.4]
    at org.apache.wicket.request.cycle.RequestCycleListenerCollection$3.notify(RequestCycleListenerCollection.java:99) [wicket-core-1.5.4.jar:1.5.4]
    at org.apache.wicket.request.cycle.RequestCycleListenerCollection$3.notify(RequestCycleListenerCollection.java:97) [wicket-core-1.5.4.jar:1.5.4]
    at org.apache.wicket.util.listener.ListenerCollection$1.notify(ListenerCollection.java:119) [wicket-util-1.5.4.jar:1.5.4]
    at org.apache.wicket.util.listener.ListenerCollection.reversedNotify(ListenerCollection.java:143) [wicket-util-1.5.4.jar:1.5.4]
    at org.apache.wicket.util.listener.ListenerCollection.reversedNotifyIgnoringExceptions(ListenerCollection.java:113) [wicket-util-1.5.4.jar:1.5.4]
    at org.apache.wicket.request.cycle.RequestCycleListenerCollection.onDetach(RequestCycleListenerCollection.java:95) [wicket-core-1.5.4.jar:1.5.4]
    at org.apache.wicket.request.cycle.RequestCycle.onDetach(RequestCycle.java:600) [wicket-core-1.5.4.jar:1.5.4]
    at org.apache.wicket.request.cycle.RequestCycle.detach(RequestCycle.java:539) [wicket-core-1.5.4.jar:1.5.4]
    at org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach(RequestCycle.java:287) [wicket-core-1.5.4.jar:1.5.4]
    at org.apache.wicket.protocol.http.WicketFilter.processRequest(WicketFilter.java:162) [wicket-core-1.5.4.jar:1.5.4]
    at org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:218) [wicket-core-1.5.4.jar:1.5.4]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) [catalina.jar:7.0.25]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) [catalina.jar:7.0.25]
    at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:359) [shiro-web-1.1.0.jar:na]
    at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:275) [shiro-web-1.1.0.jar:na]
    at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90) [shiro-core-1.1.0.jar:1.1.0]
    at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83) [shiro-core-1.1.0.jar:1.1.0]
    at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:344) [shiro-core-1.1.0.jar:1.1.0]
    at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:272) [shiro-web-1.1.0.jar:na]
    at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:81) [shiro-web-1.1.0.jar:na]
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) [spring-web-3.1.0.RELEASE.jar:3.1.0.RELEASE]
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259) [spring-web-3.1.0.RELEASE.jar:3.1.0.RELEASE]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) [catalina.jar:7.0.25]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) [catalina.jar:7.0.25]
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) [catalina.jar:7.0.25]
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) [catalina.jar:7.0.25]
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) [catalina.jar:7.0.25]
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) [catalina.jar:7.0.25]
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) [catalina.jar:7.0.25]
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) [catalina.jar:7.0.25]
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) [catalina.jar:7.0.25]
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) [catalina.jar:7.0.25]
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987) [tomcat-coyote.jar:7.0.25]
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579) [tomcat-coyote.jar:7.0.25]
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309) [tomcat-coyote.jar:7.0.25]
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) [na:1.6.0_29]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) [na:1.6.0_29]
    at java.lang.Thread.run(Thread.java:680) [na:1.6.0_29]
Caused by: java.io.NotSerializableException: org.codehaus.jackson.map.ObjectMapper
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1164) ~[na:1.6.0_29]
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) ~[na:1.6.0_29]
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) ~[na:1.6.0_29]
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) ~[na:1.6.0_29]
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) ~[na:1.6.0_29]
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) ~[na:1.6.0_29]
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) ~[na:1.6.0_29]
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) ~[na:1.6.0_29]
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) ~[na:1.6.0_29]
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) ~[na:1.6.0_29]
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) ~[na:1.6.0_29]
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) ~[na:1.6.0_29]
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) ~[na:1.6.0_29]
    at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1346) ~[na:1.6.0_29]
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1154) ~[na:1.6.0_29]
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) ~[na:1.6.0_29]
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) ~[na:1.6.0_29]
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) ~[na:1.6.0_29]
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) ~[na:1.6.0_29]
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) ~[na:1.6.0_29]
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) ~[na:1.6.0_29]
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) ~[na:1.6.0_29]
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) ~[na:1.6.0_29]
    at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1346) ~[na:1.6.0_29]
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1154) ~[na:1.6.0_29]
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) ~[na:1.6.0_29]
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) ~[na:1.6.0_29]
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) ~[na:1.6.0_29]
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) ~[na:1.6.0_29]
    at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1346) ~[na:1.6.0_29]
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1154) ~[na:1.6.0_29]
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) ~[na:1.6.0_29]
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) ~[na:1.6.0_29]
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) ~[na:1.6.0_29]
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) ~[na:1.6.0_29]
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330) ~[na:1.6.0_29]
    at org.apache.wicket.serialize.java.JavaSerializer$CheckerObjectOutputStream.writeObjectOverride(JavaSerializer.java:250) ~[wicket-core-1.5.4.jar:1.5.4]
    ... 48 common frames omitted