2

我有 Jet 0.6 作为备份和一些安装了 hazelcast-nodejs-client 0.8.0 的 Node.JS 进程。我正在尝试从 Node 进程中推送一个对象,这正是 Jet 端类似对象的反映。但是我不明白如何确保在 Jet 方面这个 JS 对象将分别被序列化/反序列化。我觉得我需要向 Jet 表明这个 JSON 对象是 Data POJO 并且应该使用正确的序列化/反序列化。

在节点方面:

var data = {
    id: someObject.did, // long
    time: someObject.time, // long
};
dataMap.put(data.id, data).then(
    function () {
        console.log("Ok");
    },
    function (error) {
        console.error(error);
    }
);

在 Jet 方面:公共类 Data 实现 Serializable {

private long id;
private long time;

public Data(long id, long time) {
    this.id = id;
    this.time = time;
}

public long getId() {
    return id;
}

public long getTime() {
    return time;
}

更新:

我设法将调用堆栈追踪到一个DefaultSerializer.ts显然负责将 JS 对象转换为Data实例以通过MapProxy服务发送到缓存的实例:

export class JsonSerializer implements Serializer {
    getId(): number {
        return -130;
    }

    read(input: DataInput): any {
        return JSON.parse(input.readUTF());
    }

    write(output: DataOutput, object: any): void {
        output.writeUTF(JSON.stringify(object));
    }
}
4

1 回答 1

3

Node.js 和 Java 端都需要正确的序列化配置。然而Serializable,这是一个仅限 Java 的接口。因此 Hazelcast Node.js 客户端无法使用它。您需要您的对象在双方都实现 IdentifiedDataSerializable 或 Portable。

Node.js 识别数据可序列化示例:https ://github.com/hazelcast/hazelcast-nodejs-client/blob/master/code_samples/org-website/IdentifiedDataSerializableSample.js

Java 识别数据可序列化示例:https ://github.com/hazelcast/hazelcast-code-samples/tree/master/serialization/identified-data-serializable

于 2018-07-11T14:19:50.643 回答