Как сохранить список строк в одном ZooKeeper znode с помощью куратора

Например, есть путь znode A/B/C/D, Я хотел бы сохранить список строк на этом znode. Очевидно, я мог бы использовать объединение списка строк в одну строку, а затем сериализовать его в байтовый массив следующим образом:

curator.create()
            .creatingParentContainersIfNeeded()
            .forPath(path, value.getBytes(StandardCharsets.UTF_8));

Но это выглядит не очень удобно. Есть ли другой подход?

2 ответа

Решение

Самый простой / лучший способ сделать это, вероятно, использовать ApacheUtils:

byte[] input = SerializationUtils.serialize(yourList);
curator.create()
        .creatingParentContainersIfNeeded()
        .forPath(path, input);

и получить это:

byte[] output = curator.getData().forPath(path);
List<String> newList = (List<String>)SerializationUtils.deserialize(output);

Это довольно общий подход, который будет работать с большинством Java-объектов.

Вы можете использовать сериализацию Json для хранения байтового потока списка на узле, если это поможет. Я использовал библиотеку Джексона для того же.

ObjectMapper mapper = new ObjectMapper();
List<String> inputList = Arrays.asList("First", "Second");
try
{
    byte[] writeValueAsBytes = mapper.writeValueAsBytes(inputList);
    curatorFramework.setData().forPath(zPath, writeValueAsBytes);
    byte[] outputBytes = curatorFramework.getData().forPath(zPath);
    List<String> outputList = mapper.readValue(outputBytes, ArrayList.class);
    System.out.println(outputList);
} catch (Exception exception)
{
    exception.printStackTrace();
}

Выход:

[First, Second]

Я надеюсь, что это также полезно для кого-то.

Другие вопросы по тегам