【问题标题】:Hazelcast ReplicatedMap serialization into fileHazelcast ReplicatedMap 序列化成文件
【发布时间】:2016-02-03 14:18:09
【问题描述】:

我正在尝试将 ReplicatedMap (hazelcast) 保存到文件系统并稍后加载,但这似乎是不可能的。有什么办法可以做到这一点吗?

详情:

Map map = HazelcastInstance.getReplicatedMap("map");
File file = new File("hazelcastmap");
FileOutputStream f = new FileOutputStream(file);
ObjectOutputStream s = new ObjectOutputStream(f);
s.writeObject(map);
s.close();

抛出的错误是:

java.io.NotSerializableException: com.hazelcast.replicatedmap.impl.ReplicatedMapProxy
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)

有什么办法可以读写 ReplicatedMap 到文件中。

谢谢大家。

【问题讨论】:

    标签: java serialization filesystems hazelcast


    【解决方案1】:

    由于 ReplicatedMap 是一种旨在保留对象引用的结构,因此您必须编写自己的代码来将 ReplicatedMap 的信息序列化到文件中。下面是一个以(非常)老式的方式执行此操作的粗略示例

    private static void writeToFile(){
    
        // Retrieve your hazelcast reference
        // hazelcast = ...
    
        Map<Object, Object> map = hazelcast.getReplicatedMap("map");
    
        FileOutputStream fos = new FileOutputStream("/tmp/out.data");
    
        ByteArrayOutputStream arrayOut = new ByteArrayOutputStream();
        DataOutputStream dataOut = new DataOutputStream(arrayOut);
    
        dataOut.writeInt(map.size());
    
        for (Entry<Object, Object> entry : map.entrySet()){
    
            dataOut.writeUTF(entry.getKey().toString());
            dataOut.writeUTF(entry.getValue().toString());
        }
    
        fos.write(arrayOut.toByteArray());
    
        //..close streams
    }
    
    private static void readFromFile() throws Exception{
    
        FileInputStream fis = new FileInputStream("/tmp/out.data");
        DataInputStream dataIn = new DataInputStream(fis);
    
        Map<Object, Object> map = hazelcast.getReplicatedMap("map");
    
        int size = dataIn.readInt();
    
        for (int i = 0; i < size; i++){
    
            String key = dataIn.readUTF();
            String value = dataIn.readUTF();
    
            //Convert the String 'value' into your Object
            //put the pair key value into the map
        }
    
        //..close streams
    }
    

    【讨论】:

    • 感谢您的回答。因此,序列化的最佳方法是从 ReplicatedMap 中获取值,将它们放入 HashMap 中,然后对其进行序列化/反序列化。然后使用 ReplicatedMap:putAll(HashMap) 加载 ReplicatedMap 的值。
    猜你喜欢
    • 2022-11-04
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 2017-12-30
    • 1970-01-01
    相关资源
    最近更新 更多