Как прочитать термин Erlang из Redis с помощью Java-клиента?
Например, я сохраняю кортеж T = {k1, v1, k2, v2} в redis с помощью jedis:
eredis:q(Conn, ["SET", <<"mykey">>, term_to_binary(T)]).
Я пытаюсь использовать код ниже, чтобы прочитать этот термин Erlang:
Jedis j = Redis.pool.getResource();
byte[] t = j.get("mykey").getBytes();
OtpInputStream ois = new OtpInputStream(t);
System.out.println(OtpErlangObject.decode(ois));
Ошибка: com.ericsson.otp.erlang.OtpErlangDecodeException: неизвестный тип данных: 239.
Так, как я могу получить термин erlang правильно?
Эрланг сторона:
term_to_binary ({k1, v1, k2, v2}).
<< 131,104,4,100,0,2,107,49,100,0,2,118,49,100,0,2,107,50, 100,0,2,118,50 >>
Java сторона:
j.get ("MyKey") GetBytes().:
-17 -65 -67 104 4 100 0 2 107 49 100 0 2 118 49 100 0 2 107 50 100 0 2 118 50.
Кажется, что только первые 3 байта отличаются. Поэтому я изменяю их на byte (131), и затем он может быть правильно напечатан с помощью System.out.println(OtpErlangObject.decode(ois)).
Но когда термин более сложный, например, для записи со списком внутри, он не будет работать. Потому что некоторые другие символы будут появляться не только в начале данных, но также в конце и в середине.
Почему сохраненные данные отличаются от полученных?
1 ответ
Отрицательные числа в начале байтового массива не являются допустимыми значениями для синтаксиса внешнего термина erlang.
Я бы предположил, что, поскольку вы в течение некоторого времени хранили термины эрланга в redis таким образом, вы вставляете их правильно.
Это действительно оставляет только одно: когда вы звоните getBytes()
ваша кодировка отключена, скорее всего, она использует любую кодировку, установленную по умолчанию в вашей системе (вероятно, UTF-8, но я не уверен). На самом деле, что вы хотите сделать, это передать другую кодировку getBytes()
, вероятно, так: getBytes("US-ASCII")
,
Проверьте документацию для кодировки доступны.
Вот ссылка на SO, которая показывает, как преобразовать строку в байтовый массив ASCII.