Hazelcast - Что такое методы записи и чтения свойства Map для переносимой сериализации - PullRequest
0 голосов
/ 31 августа 2018

Я реализую портативную сериализацию в Hazelcast. Я сохраняю Java-объект (Employee) в hazelcast, который содержит свойство типа Map . Какие методы будут использоваться для сериализации этого map свойства здесь?

public class Employee implements Serializable, Portable {
    private String name;
    private Map<Integer, Address> addresses;

    // getters and setters

    @Override
    public int getFactoryId() {
        return 1;
    }

    @Override
    public int getClassId() {
        return 1;
    }

    @Override
    public void writePortable(PortableWriter writer) throws IOException {
        writer.writeUTF("name", name);
        // how to write addresses field here
    }

    @Override
    public void readPortable(PortableReader reader) throws IOException {
        name = reader.readUTF("name");
        // how to read addresses field here
    }
}

Значение карты 'Адрес' также реализует Portable и требует методов чтения и записи.

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

@ JavaCodeNet, если Address не Portable, после записи всех ваших примитивных и Portable объектов вы можете вызвать writer.getRawDataOutput(), который вернет вам ObjectDataOutput. Используя это, вы можете вызвать writer.getRawDataOutput().writeData(addresses), если Address реализует Java Serializable.

Если нет, и он реализует другие интерфейсы сериализации Hazelcast, такие как DataSerializable или сторонний сериализатор, то вам сначала нужно подсчитать количество больного, перебрать записи карты и сериализации отдельно, используя тот же writer.getRawDataOutput() metmod и сделать то же самое при чтении. .

0 голосов
/ 31 августа 2018

Я полагаю, что вы не можете сделать это напрямую, поскольку вам потребуется реализация Map, которая также реализует Portable. К сожалению, Hazelcast, кажется, не обеспечивает один.

Однако вы можете вместо этого использовать PortableCollection. Оберните вашу карту в экземпляр PortableCollection во время записи, вызвав конструктор и передав результат Map.entrySet (), который является коллекцией. Во время чтения создайте экземпляр Map из десериализованных значений. Обратите внимание, однако, что при этом отдельные значения карты не сериализуются в формате Portable! Вместо этого используется необработанный сериализатор.

Если вам нужна портативная сериализация для всего этого, я думаю, вам придется реализовать Portable Map самостоятельно.

(здесь используется Hazelcast 3.7.3)

...