0

Java側で言語の境界を越えるには、シリアル化されるクラスにDataSerializableインターフェースを実装する必要があります。そして、c#のデシリアライザーにそれがどのクラスであるかを知らせるために、classIDを登録する必要があります。例に従って、Javaでクラスを次のように記述します。

public class Stuff implements DataSerializable{
    static { // note that classID (7) must match C#
        Instantiator.register(new Instantiator(Stuff.class,(byte)0x07) {
        @Override
        public DataSerializable newInstance() {
            return new Stuff();
        }
      });
    }
    private Stuff(){}

    public boolean equals(Object obj) {...}
    public int hashCode() {...}

    public void toData(DataOutput dataOutput) throws IOException {...}
    public void fromData(DataInput dataInput) throws IOException, ClassNotFoundException { ...}
}

見た目は問題ありませんが、実行すると次の例外が発生します。

[警告2012/03/3015:06:00.239 JST tid = 0x1]プールでのインスタンス化の登録中にエラーが発生しました:com.gemstone.gemfire.cache.client.ServerOperationException::com.gemstone.gemfire.cacheでリモートregisterInstantiatorsを実行中。 client.internal.AbstractOp.processAck(AbstractOp.java:247)at com.gemstone.gemfire.cache.client.internal.RegisterInstantiatorsOp $ RegisterInstantiatorsOpImpl.processResponse(RegisterInstantiatorsOp.java:76)atcom.gemstone.gemfire.cache.client。 internal.AbstractOp.attemptReadResponse(AbstractOp.java:163)at com.gemstone.gemfire.cache.client.internal.AbstractOp.attempt(AbstractOp.java:363)atcom.gemstone.gemfire.cache.client.internal.ConnectionImpl。 execute(ConnectionImpl.java:229)at com.gemstone.gemfire.cache.client.internal.pooling.PooledConnection.execute(PooledConnection.java:321)com.gemstone.gemfire.cache.client.internal.OpExecutorImpl.executeWithPossibleReAuthentication(OpExecutorImpl.java:646)at com.gemstone.gemfire.cache.client.internal.OpExecutorImpl.execute(OpExecutorImpl.java:108) .gemstone.gemfire.cache.client.internal.PoolImpl.execute(PoolImpl.java:624)at com.gemstone.gemfire.cache.client.internal.RegisterInstantiatorsOp.execute(RegisterInstantiatorsOp.java:39)at com.gemstone.gemfire .internal.cache.PoolManagerImpl.allPoolsRegisterInstantiator(PoolManagerImpl.java:216)at com.gemstone.gemfire.internal.InternalInstantiator.sendRegistrationMessageToServers(InternalInstantiator.java:188)at com.gemstone.gemfire.internal.InternalInstantiator :143)com.gemstone.gemfire.internal.InternalInstantiatorで。register(InternalInstantiator.java:71)at com.gemstone.gemfire.Instantiator.register(Instantiator.java:168)at Stuff。(Stuff.java)

原因:java.lang.ClassNotFoundException:Stuff $ 1

理由がわからなかったのですが、経験のある人が助けてくれる人はいますか?前もって感謝します!

4

1 に答える 1

1

ほとんどの構成では、GemFire サーバーは、オブジェクトにインデックスを付け、クエリを実行し、リスナーを呼び出すために、オブジェクトを逆シリアル化する必要があります。そのため、インスタンシエーターを登録すると、分散システム内のすべてのマシンにクラスが登録されます。したがって、クラス自体は、クラスター内のどこでもロードできる必要があります。

例外スタック トレースによると、エラーはリモート ノードで発生します。

クラスターに参加しているすべてのマシンにクラス Stuff があるかどうかを確認します。少なくともキャッシュサーバーでは。

于 2012-04-03T10:16:02.533 に答える