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)
...

私のソフトウェア環境

  • Web フレームワーク: Wicket 1.5.7
  • Java: 1.6.0_33; Java HotSpot(TM) クライアント VM 20.8-b03
  • Web サーバー システム: 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())。

私にとって奇妙なことの 1 つは、Wicket が自分のWebSessionインスタンスを Google App Engine for Java (GAE/J) 環境でシリアル化することを期待しているのに、GAE/J 開発 Web サーバーを使用してまだ検出されなかったのはなぜですか?

于 2012-07-12T10:51:25.380 に答える