GemFire: сериализация объектов в Java, а затем десериализация их в c # - PullRequest
0 голосов
/ 30 марта 2012

Чтобы пересечь границу языка на стороне 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 /30 15: 06: 00.239 JST tid = 0x1] Ошибка регистрации экземпляра в пуле: com.gemstone.gemfire.cache.client.ServerOperationException:: при выполнении удаленного registerInstantiators в com.gemstone.gemfire.cache.client.internal.AbstractOp.processAck (AbstractOp.java:247) в com.gemstone.gemfire.cache.client.internal.RegisterInstantiatorsOp $ RegisterInstantiatorsOpImpl.processResponse (RegisterInstantiatorsOp.java:76) в com.gemstone.gemfire.cache.atesEAbstractOp.java:163) в com.gemstone.gemfire.cache.client.internal.AbstractOp.attempt (AbstractOp.java:363) в com.gemstone.gemfire.cache.client.internal.ConnectionImpl.execute (ConnectionImpl.java:229) в com.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) в кэше.ПулJava: 216) в com.gemstone.gemfire.internal.InternalInstantiator.sendRegistrationMessageToServers (InternalInstantiator.java:188) в com.gemstone.gemfire.internal.InternalInstantiator._register (InternalInstantiator.java:143) в com.ge.ge.InternalInstantiator.register (InternalInstantiator.java:71) в com.gemstone.gemfire.Instantiator.register (Instantiator.java:168) в Stuff. (Stuff.java)

Причина: java.lang.ClassNotFoundException: Вещи $ 1

Я не мог понять, почему этоКто-нибудь, у кого есть опыт, может помочь?Заранее спасибо!

1 Ответ

1 голос
/ 03 апреля 2012

В большинстве конфигураций серверам GemFire ​​необходимо десериализовать объекты для их индексации, выполнения запросов и прослушивания вызовов.Таким образом, когда вы регистрируете экземпляр, класс будет зарегистрирован на всех машинах в распределенной системе.Следовательно, сам класс должен быть доступен для загрузки везде в кластере.

Как показывает трассировка стека исключений, ошибка происходит на удаленном узле.

Проверьте, есть ли у вас класс Stuff на всех машинах, участвующих в кластере.По крайней мере, на серверах кеша.

...