如何使用java客户端从redis中读取erlang术语



例如,我通过jedis:将元组T={k1,v1,k2,v2}保存到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术语呢?


二郎面:

term_to_binary({k1,v1,k2,v2}(。

<lt;131104,4100,0,2107,49100,0,2118,49100,0.2107,50,100,0,2118,50>>

Java端:

j.get("mykey"(.getBytes((:

-17-65-67 104 4 100 0 2 107 49 100 2 118 49 100 2 107 50 100 0 2 118 50。

似乎只有前3个字节不同。所以我把它们改为字节(131(,然后用System.out.println(OtpErlangObject.decode(ois((.正确打印

但当这个词更复杂时,比如对于一张里面有列表的唱片,它就不起作用了。因为其他一些字符不仅会出现在数据的开头,还会出现在末尾和中间

为什么我保存的数据与我得到的数据不同?

字节数组开头的负数对于erlang外部术语语法来说是无效值。

我认为,由于您已经以这种方式在redis中存储erlang术语一段时间了,因此您正确地插入了它们。

这实际上只剩下一件事:当你调用getBytes()时,你的编码是关闭的,它很可能使用系统上设置为默认编码的任何编码(可能是UTF-8,但我不确定(。实际上,您想要做的是将不同的编码传递给getBytes(),可能如下所示:getBytes("US-ASCII")

查看编码文档。

SO上有一个链接,展示了如何将字符串转换为ASCII字节数组。

最新更新