0

我正在尝试确定会话的大小,我想在开始进行开发更改时对其进行跟踪。我的应用程序运行正常,没有序列化错误——除非我尝试获取会话大小。

在 Wicket 1.4 中,我记得我没有问题,但现在我做不到。如果我在PageBase构造函数中获得会话大小,我会得到同样的错误。

谁能看到我做错了什么?

Java 代码

public class PageBase extends WebPage
{
  private static final long serialVersionUID = 1L;
  ...
  @Override
  protected void onAfterRender()
  {
    super.onAfterRender();

    Session ssnSession = Session.get();
    long loSize = ssnSession.getSizeInBytes();    <-- Exception is raised here
    ...
  }
  ...
}

堆栈跟踪

11-Jul-2012 19:30:11 org.apache.wicket.util.lang.WicketObjects$SerializingObjectSizeOfStrategy sizeOf
WARNING: Unable to determine object size: [...].MySession@d2f5f1
java.io.NotSerializableException: java.lang.Object
  at java.io.ObjectOutputStream.writeObject0(Unknown Source)
  at java.io.ObjectOutputStream.defaultWriteFields(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.writeObject(Unknown Source)
  at org.apache.wicket.util.lang.WicketObjects$SerializingObjectSizeOfStrategy.sizeOf(WicketObjects.java:124)
  at org.apache.wicket.util.lang.WicketObjects.sizeof(WicketObjects.java:416)
  at org.apache.wicket.Session.getSizeInBytes(Session.java:439)
  at [...].PageBase.onAfterRender(PageBase.java:212)
  at org.apache.wicket.Component.afterRender(Component.java:962)
  at org.apache.wicket.Component.render(Component.java:2326)
  at org.apache.wicket.Page.renderPage(Page.java:1035)
  at org.apache.wicket.request.handler.render.WebPageRenderer.renderPage(WebPageRenderer.java:105)
...

我的软件环境

  • 网络框架:Wicket 1.5.7
  • 爪哇:1.6.0_33;Java HotSpot(TM) 客户端虚拟机 20.8-b03
  • 网络服务器系统:Google App Engine for Java 1.7.0 版
  • 操作系统:Microsoft Windows XP Home Edition 2002 SP3(在 x86 上运行的 5.1 版;Cp1252;en_GB)
4

1 回答 1

0

我已经设法解决了我的问题

dev_appserver.cmd --jvm_flag=-Dsun.io.serialization.extendedDebugInfo=true

突出显示有问题的数据成员。在我的WebSession情况下,我使用

private final Object m_objLockItemPaidStatus = new Object();

将处理锁定在一个synchronized块中。我已将其更改为使用

/**
 * This class is the simplest possible class which can be used as an object
 * to lock processing in a <code>synchronized</code> block
 * and which can also be serialised.
 * (This class extends <code>java.lang.Object</code> solely to implement the
 * <code>java.io.Serializable</code> interface.)
 */
public static class LockObject extends Object implements Serializable
{
  private static final long serialVersionUID = 1L;

  public LockObject()
  {
    super();
  }
}

相反,为了确保我的WebSession实例可以被序列化(所以我也可以使用 找到它们的近似大小WebSession#getSizeInBytes())。

对我来说奇怪的一件事是,既然我希望 Wicket 能够WebSession在我的 Google App Engine for Java (GAE/J) 环境中序列化我的实例,为什么还没有使用 GAE/J 开发 Web 服务器来获取呢?

于 2012-07-12T10:51:25.380 回答