【问题标题】:Hazelcast Serialization Exception when trying to deserialize date object尝试反序列化日期对象时出现 Hazelcast 序列化异常
【发布时间】: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


    【解决方案1】:

    应该

    if (!field.getType().isAssignableFrom(Outer.class))
    

    成为

    if (!field.getType().isAssignableFrom(Date.class))
    

    内部类没有外部类作为字段,所以不需要序列化它。但它确实有日期字段并且没有这样做的逻辑。

    另外,如果你使用反射,它会很慢

    【讨论】:

    • 我有 if 检查以避免外部类对象字段的序列化,该字段可作为内部类中的字段作为 this$0 使用,这会导致循环递归。对于所有其他对象,我需要序列化if (!field.getType().isAssignableFrom(Outer.class)) 请检查使用的否定条件。
    • 试试这个,把} else if (field.getType().isAssignableFrom(Date.class)) { field.set(this, in.readObject());} else if (field.getType().isAssignableFrom(Date.class)) { out.writeObject(value);添加到你的Basic类。为我工作!需要在 Outer.class 的行之前去
    猜你喜欢
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多