1

Redis lua 脚本如下:

local vv = cmsgpack.unpack(msgpack)
local mv = {[\"v\"]=v, [\"t\"]=t, [\"tp\"]=tp, [\"pt\"] = pt} 
table.insert(vv, mv) 
msgpack = cmsgpack.pack(vv)

我用java得到表:

@Message
public static class UserMessage {
  public String v;
  public long t;
  public String tp;
  public String pt;
}

String ret = redisClient.hget(uid, "m:v");
byte[] bytes = ret.getBytes();
MessagePack msgpack = new MessagePack();
ByteArrayInputStream in = new ByteArrayInputStream(bytes);
Unpacker unpacker = msgpack.createUnpacker(in);
UserMessage[] dst = unpacker.read(UserMessage[].class);

但它是错误的,它无法正确解包,我不知道我的错在哪里?这个问题困扰了我很久...

4

1 回答 1

1

问题可能是您使用 String 对象从 HGET 获取结果。你需要一个字节[]。String 对象会做各种讨厌的事情,比如解释代码页、空字符等等。即使它有效,它也是很多开销。所以使用一个字节[],我猜你的redis客户端有办法做到这一点。

我们使用 aredis 从 Redis 中检索 msgpack 数据。这里有一些线索:

import org.aredis.cache.AsyncRedisClient;
import org.aredis.cache.AsyncRedisFactory;
import org.aredis.cache.DataHandler;
import org.aredis.cache.RedisCommand;
import org.aredis.cache.RedisCommandInfo;
import org.aredis.io.CompressibleByteArrayOutputStream;
import org.aredis.net.ServerInfo;

private class RawHandler extends Object implements DataHandler {

  @Override
  public Object deserialize(Object arg0, byte[] arg1, int arg2, int arg3, ServerInfo arg4) throws IOException {
    return arg1;
  }

  @Override
  public void serialize(Object arg0, Object arg1, CompressibleByteArrayOutputStream arg2, ServerInfo arg3) throws IOException {
    throw new NotActiveException("Not supported, deserialize only.");
  }

}

Future<RedisCommandInfo> futureOE = oRedis.oCliDpart.submitCommand(
    new RawHandler(),
    RedisCommand.ZRANGEBYLEX,
    "_ourkey#blabla.d",
    String.format("[%s;", cDbAndTable),
    String.format("(%s<", cDbAndTable));
  ...

  final Object[] val = (Object[]) futureOE.get().getResult();
  for (Object item : val) {
    if (item instanceof byte[]) {
    ...

msgpack 反序列化从那里应该是微不足道的。

希望这会有所帮助,TW

于 2014-08-16T20:15:52.197 回答