Java HazelcastSerializationException依赖于操作系统
最近我收到了一些关于HZ的奇怪错误。序列化/反序列化。我有一台装有hazelcast服务器的Windows服务器。在我在Linux机器上运行的测试中,我可以通过HazelcastClient API连接到Hazelcast服务器,注册SerializationFactory并从HZ服务器获取一些集合。 我使用简单的IdentifiedDataSerializable接口来序列化/反序列化实体。 实体由3个字段组成:字符串、整型、整型 结果我得到HazelcastSerializationException。这是因为Windows和Linux机器之间的差异吗 这就是测试用例:Java HazelcastSerializationException依赖于操作系统,java,linux,windows,serialization,hazelcast,Java,Linux,Windows,Serialization,Hazelcast,最近我收到了一些关于HZ的奇怪错误。序列化/反序列化。我有一台装有hazelcast服务器的Windows服务器。在我在Linux机器上运行的测试中,我可以通过HazelcastClient API连接到Hazelcast服务器,注册SerializationFactory并从HZ服务器获取一些集合。 我使用简单的IdentifiedDataSerializable接口来序列化/反序列化实体。 实体由3个字段组成:字符串、整型、整型 结果我得到HazelcastSerializationExce
import java.io.IOException;
import java.util.Arrays;
import java.util.Set;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.BlockJUnit4ClassRunner;
import com.hazelcast.client.HazelcastClient;
import com.hazelcast.client.config.ClientConfig;
import com.hazelcast.client.config.ClientNetworkConfig;
import com.hazelcast.config.GroupConfig;
import com.hazelcast.config.SerializationConfig;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.core.IMap;
import com.hazelcast.nio.ObjectDataInput;
import com.hazelcast.nio.ObjectDataOutput;
import com.hazelcast.nio.serialization.DataSerializableFactory;
import com.hazelcast.nio.serialization.HazelcastSerializationException;
import com.hazelcast.nio.serialization.IdentifiedDataSerializable;
/**
*
* @author igor.masternoy
*
*/
@RunWith(BlockJUnit4ClassRunner.class)
public class HZSerialTest {
private static final int FACROTY_ID = 42;
private static final int ENTITY_ID = 42;
private static final String WINDOWS_HZ_SERVER_IP = "###.###.###.###";
private static final String TEST_FIELD = "CHESTERFIELD";
private static final String TEST_COLLECTION = "CHESTERFIELD";
@Test(expected = HazelcastSerializationException.class)
public void test() {
ClientConfig clientConfig = new ClientConfig();
ClientNetworkConfig networkConfig = clientConfig.getNetworkConfig();
String[] serverAddresses = new String[] { WINDOWS_HZ_SERVER_IP };
// logger.info("Hazelcast servers IPs {" + Arrays.toString(serverAddresses) + "}");
networkConfig.addAddress(serverAddresses);
networkConfig.setSmartRouting(true);
networkConfig.setConnectionTimeout(30000);
clientConfig.setGroupConfig(new GroupConfig("dev",
"dev-pass"));
SerializationConfig serializationConfig = clientConfig.getSerializationConfig();
serializationConfig
.addDataSerializableFactory(FACROTY_ID, new TestObjectSerializationFactory());
clientConfig.setSerializationConfig(serializationConfig);
HazelcastInstance instance = HazelcastClient.newHazelcastClient(clientConfig);
Set<TestEntity> testSet = instance.getSet(TEST_COLLECTION);
testSet.add(new TestEntity(1, 1, TEST_FIELD));
testSet = instance.getSet(TEST_COLLECTION);
IMap<String, TestEntity> map = instance.getMap("test.map");
map.put("key", new TestEntity(1, 1, TEST_FIELD));
TestEntity entity = testSet.iterator().next();
// logger.info("{}", entity);
entity = map.get("key");
// logger.info("{}", entity);
}
class TestObjectSerializationFactory implements DataSerializableFactory {
@Override
public IdentifiedDataSerializable create(int typeId) {
IdentifiedDataSerializable obj = null;
switch (typeId) {
case 42:
obj = new TestEntity();
break;
default:
// logger.error("Wow wo?w wow not a case");
break;
}
return obj;
}
}
class TestEntity implements IdentifiedDataSerializable {
private String field;
private int field2;
private int field3;
public TestEntity() {
}
public TestEntity(int field2,
int field3,
String field) {
super();
this.field = field;
}
@Override
public void readData(ObjectDataInput in) throws IOException {
field = in.readUTF();
field2 = in.readInt();
field3 = in.readInt();
}
@Override
public void writeData(ObjectDataOutput out) throws IOException {
out.writeUTF(field);
out.writeInt(field2);
out.writeInt(field3);
}
@Override
public int getFactoryId() {
return FACROTY_ID;
}
@Override
public int getId() {
return ENTITY_ID;
}
@Override
public String toString() {
return "TestEntity [field=" + field + field2 + field3 + "]";
}
}
}
Igor,你能提供Hazelcast版本和完整的异常跟踪吗。谢谢哦,对不起。我忘了堆栈跟踪中有一些有趣的东西,比如“com.hazelcast.nio.serialization.HazelcastSerializationException:java.io.eofeexception:无法读取4字节!”
com.hazelcast.nio.serialization.HazelcastSerializationException: java.io.EOFException: Cannot read 4 bytes!
at com.hazelcast.nio.serialization.SerializationServiceImpl.handleException(SerializationServiceImpl.java:380)
at com.hazelcast.nio.serialization.SerializationServiceImpl.toObject(SerializationServiceImpl.java:282)
at com.hazelcast.client.spi.ClientProxy.toObject(ClientProxy.java:183)
at com.hazelcast.client.proxy.AbstractClientCollectionProxy.getAll(AbstractClientCollectionProxy.java:205)
at com.hazelcast.client.proxy.AbstractClientCollectionProxy.iterator(AbstractClientCollectionProxy.java:83)
at com.bam.messaging.HZSerialTest.test(HZSerialTest.java:71)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: java.io.EOFException: Cannot read 4 bytes!
at com.hazelcast.nio.serialization.ByteArrayObjectDataInput.checkAvailable(ByteArrayObjectDataInput.java:543)
at com.hazelcast.nio.serialization.ByteArrayObjectDataInput.readInt(ByteArrayObjectDataInput.java:255)
at com.hazelcast.nio.serialization.ByteArrayObjectDataInput.readInt(ByteArrayObjectDataInput.java:249)
at com.bam.messaging.HZSerialTest$TestEntity.readData(HZSerialTest.java:117)
at com.hazelcast.nio.serialization.DataSerializer.read(DataSerializer.java:111)
at com.hazelcast.nio.serialization.DataSerializer.read(DataSerializer.java:39)
at com.hazelcast.nio.serialization.StreamSerializerAdapter.read(StreamSerializerAdapter.java:41)
at com.hazelcast.nio.serialization.SerializationServiceImpl.toObject(SerializationServiceImpl.java:276)
... 27 more