2012-03-30 83 views
0

要在Java端跨越语言边界,要序列化的类需要实现DataSerializable接口;为了让c#中的反序列化器知道它是什么类,我们需要注册一个classID。下面的例子中,我写我的Java类是这样的:GemFire:在Java中序列化对象,然后在c#中反序列化它们#

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/30警告15:06: 00.239 JST TID =为0x1]错误注册上池 实例化: com.gemstone.gemfire.cache.client.ServerOperationException:虽然在 com.gemstone.gemfire.cache.client.internal.AbstractOp.processAck执行远程registerInstantiators (AbstractOp.java:247) at com.gemstone.g emfire.cache.client.internal.RegisterInstantiatorsOp $ RegisterInstantiatorsOpImpl.processResponse(RegisterInstantiatorsOp.java:76) 在 com.gemstone.gemfire.cache.client.internal.AbstractOp.attemptReadResponse(AbstractOp.java:163) 在 融为一体。 gemstone.gemfire.cache.client.internal.AbstractOp.attempt(AbstractOp.java:363) 在 com.gemstone.gemfire.cache.client.internal.ConnectionImpl.execute(ConnectionImpl.java:229) 在 融为一体。 gemstone.gemfire.cache.client.internal.pooling.PooledConnection.execute(PooledConnection.java:321) 在 com.gemstone.gemfire.cache.client.internal.OpExecutorImpl.executeWithPossibleReAuthentication(OpExecutorImpl.java:646) 在 com.gemstone.gemfire.cache.client.internal.OpExecutorImpl.execute(OpExecutorImpl.java:108) 在 com.gemstone.gemfire.cache.client.internal.PoolImpl.execute(PoolImpl.java:624) 在 com.gemstone.gemfire.cache.client.internal.RegisterInstantiatorsOp.execute(RegisterInstantiatorsOp.java:39) 在 com.gemstone.gemfire.internal.cache.PoolManagerImpl.allPoolsRegisterInstantiator(PoolManagerImpl.java:216) 在 COM .gemstone.gemfire.internal.InternalInstantiator.sendRegistrationMessageToServers(InternalInstantiator.java:188) at com.gemstone.gemfire.internal.InternalInstantiator._register(InternalInstantiator.java:143) at com.gemstone.gemfire.internal.InternalInstantiator.register(InternalInstantiator.java:71) 在com.gemstone.gemfire.Instantiator.register(Instantiator.java:168) 在东西。(Stuff.java)

导致:java.lang.ClassNotFoundException:东西$ 1

我想不通为什么,有没有人有经验可以帮助?提前致谢!

+0

您能否提供更多或完整的代码示例。 – Avinash 2013-09-06 11:57:24

回答

1

在大多数配置中,GemFire服务器需要反序列化对象以便为它们建立索引,运行查询和调用监听器。所以当你注册实例化器时,这个类将被注册到分布式系统中的所有机器上。因此,该类本身必须可用于加载群集中的任何地方。

由于异常堆栈跟踪表示错误发生在远程节点上。

检查参与群集的所有机器上是否有类Stuff。至少在缓存服务器上。