Как сохранить список строк в одном 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]
Я надеюсь, что это также полезно для кого-то.