【发布时间】:2018-05-17 15:32:37
【问题描述】:
我有嵌套类,它具有日期字段以及其他原始字段。我已经实现了 Outer 和 Inner 类的 DataSerializable 接口。
外部类
public class Outer implements DataSerializable {
private static final long serialVersionUID = 1L;
private Long number;
private String enumerationType;
private Basic basic;
.
.
.
@Override
public void readData(ObjectDataInput in) throws IOException {
number = in.readLong();
enumerationType = in.readUTF();
basic = new Basic();
basic.readData(in);
}
@Override
public void writeData(ObjectDataOutput out) throws IOException {
out.writeLong(number);
out.writeUTF(enumerationType);
basic.writeData(out);
}
}
内部类 - 基本
private class Basic implements DataSerializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private String a;
private String b;
private String c;
private String d;
private String e;
private String f;
private String g;
private String h;
private String i;
private Date date1;
private Long long1;
private Date date2;
private Long long2;
@Override
public void readData(ObjectDataInput in) throws IOException {
Field[] fields = HazelcastUtil.ReflectUtil.getFields(this.getClass());
for (Field field : fields) {
if (!java.lang.reflect.Modifier.isStatic(field.getModifiers())) {
try {
if (field.getType().isAssignableFrom(String.class)) {
field.set(this, in.readUTF());
} else if (field.getType().isAssignableFrom(Long.class)) {
field.set(this, in.readLong());
} else if (field.getType().isAssignableFrom(Character.class)) {
field.set(this, in.readChar());
} else if (!field.getType().isAssignableFrom(Outer.class)) {
field.set(this, in.readObject(field.getType()));
}
//}
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
@Override
public void writeData(ObjectDataOutput out) throws IOException {
//out.writeUTF(replacementNpi);
Field[] fields = HazelcastUtil.ReflectUtil.getFields(this.getClass());
for (Field field : fields) {
if (!java.lang.reflect.Modifier.isStatic(field.getModifiers())) {
try {
Object value = field.get(this);
if (value != null) {
//HazelCastLogger.info(value.getClass()+" >> "+value.toString()+" >> "+field.getName() + " >> "+field.getType(), this.getClass());
if (field.getType().isAssignableFrom(String.class)) {
out.writeUTF((String) value);
} else if (field.getType().isAssignableFrom(Long.class)) {
out.writeLong((Long) value);
} else if (field.getType().isAssignableFrom(Character.class)) {
out.writeChar((Character) value);
} else if (!field.getType().isAssignableFrom(Outer.class)) {
out.writeObject(value);
}
}
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
在加载地图时,我遇到了以下异常。
com.hazelcast.nio.serialization.HazelcastSerializationException: StreamSerializerAdapter{serializer=com.hazelcast.internal.serialization.impl.JavaDefaultSerializers$DateSerializer@f8b802f} is not implementing the interface com.hazelcast.nio.serialization.TypedStreamDeserializer interface. Please implement this interface to deserialize for class class java.util.Date
at com.hazelcast.internal.serialization.impl.StreamSerializerAdapter.read(StreamSerializerAdapter.java:55)
at com.hazelcast.internal.serialization.impl.AbstractSerializationService.readObject(AbstractSerializationService.java:294)
at com.hazelcast.internal.serialization.impl.ByteArrayObjectDataInput.readObject(ByteArrayObjectDataInput.java:580)
at com.entity.Outer$Basic.readData(Outer.java:626)
at com.entity.Outer.readData(Outer.java:155)
at com.hazelcast.internal.serialization.impl.DataSerializableSerializer.readInternal(DataSerializableSerializer.java:158)
at com.hazelcast.internal.serialization.impl.DataSerializableSerializer.read(DataSerializableSerializer.java:105)
at com.hazelcast.internal.serialization.impl.DataSerializableSerializer.read(DataSerializableSerializer.java:50)
at com.hazelcast.internal.serialization.impl.StreamSerializerAdapter.read(StreamSerializerAdapter.java:48)
at com.hazelcast.internal.serialization.impl.AbstractSerializationService.toObject(AbstractSerializationService.java:191)
at com.hazelcast.map.impl.record.ObjectRecordFactory.newRecord(ObjectRecordFactory.java:37)
at com.hazelcast.map.impl.recordstore.AbstractRecordStore.createRecord(AbstractRecordStore.java:95)
at com.hazelcast.map.impl.recordstore.DefaultRecordStore.createRecord(DefaultRecordStore.java:78)
at com.hazelcast.map.impl.recordstore.DefaultRecordStore.putFromLoadInternal(DefaultRecordStore.java:956)
at com.hazelcast.map.impl.recordstore.DefaultRecordStore.putFromLoad(DefaultRecordStore.java:931)
at com.hazelcast.map.impl.operation.PutFromLoadAllOperation.run(PutFromLoadAllOperation.java:74)
at com.hazelcast.spi.Operation.call(Operation.java:148)
at com.hazelcast.spi.impl.operationservice.impl.OperationRunnerImpl.call(OperationRunnerImpl.java:202)
at com.hazelcast.spi.impl.operationservice.impl.OperationRunnerImpl.run(OperationRunnerImpl.java:191)
at com.hazelcast.spi.impl.operationexecutor.impl.OperationThread.process(OperationThread.java:120)
at com.hazelcast.spi.impl.operationexecutor.impl.OperationThread.run(OperationThread.java:100)
该异常专门针对 java.util.Date 对象。
com.hazelcast.nio.serialization.HazelcastSerializationException: StreamSerializerAdapter{serializer=com.hazelcast.internal.serialization.impl.JavaDefaultSerializers$DateSerializer@f8b802f} 未实现接口 com.hazelcast.nio.serialization.TypedStreamDeserializer 接口。请实现该接口以反序列化类 class java.util.Date
您能帮我解决这个问题吗?我正在使用 hazelcast IMDG 3.10 版以及 maven 和 spring boot。
【问题讨论】:
标签: java serialization deserialization hazelcast