たとえば、タプル T = {k1, v1, k2, v2} を jedis で redis に保存します。
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 用語を正しく取得できますか?
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)) で正しく印刷できます。
ただし、リストが含まれるレコードなど、用語がより複雑な場合は機能しません。データの先頭だけでなく、末尾や途中にも他の文字が表示されるためです。
保存したデータが取得したデータと異なるのはなぜですか?