msgpack-java icon indicating copy to clipboard operation
msgpack-java copied to clipboard

byte[] array unpack error

Open heliteng opened this issue 7 years ago • 5 comments

# java POJO `public class ReportHeadParam {

private Integer messageType;
private byte[] messageParam;

public Integer getMessageType() {
	return messageType;
}
public void setMessageType(Integer messageType) {
	this.messageType = messageType;
}
public byte[] getMessageParam() {
	return messageParam;
}
public void setMessageParam(byte[] messageParam) {
	this.messageParam = messageParam;
}

}`

# data from rabbitmq

` byte[] s = (byte[]) helper.decodeMessage(message);

ReportHeadParam head = MsgPackUtil.toObject(s, ReportHeadParam.class);`

# output error message

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize a POJO (of type com.comtop.dbaas.monitor.dto.ReportInstanceStateParam) from non-Array representation (token: VALUE_NUMBER_INT): type/property designed to be serialized as JSON Array at [Source: (byte[])"?????mysql5.7?????mysql.ys.246.02???oNsAgef6?oNsAgef6-2?2018-05-17 11:30:01?ONLINE "; line: -1, column: 0] at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:63) at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1342) at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1138) at com.fasterxml.jackson.databind.deser.impl.BeanAsArrayDeserializer._deserializeFromNonArray(BeanAsArrayDeserializer.java:365) at com.fasterxml.jackson.databind.deser.impl.BeanAsArrayDeserializer.deserialize(BeanAsArrayDeserializer.java:97) at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4001) at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3079) at com.comtop.dbaas.util.MsgPackUtil.toObject(MsgPackUtil.java:62) at com.comtop.dbaas.worker.mq.RabbitmqConfig$2.onMessage(RabbitmqConfig.java:269)

heliteng avatar May 17 '18 02:05 heliteng

@heliteng

Could you give me the followings?

  • codes of MsgPackUtil.toObject
  • actual values in byte array s

komamitsu avatar May 17 '18 02:05 komamitsu

@komamitsu

MsgPackUtil.java

`package com.comtop.dbaas.util;

import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.ObjectMapper; import org.msgpack.jackson.dataformat.*;

import java.io.IOException; import java.util.ArrayList; import java.util.List;

public class MsgPackUtil { private static ObjectMapper mapper = new ObjectMapper(new MessagePackFactory());

/**
 * @Title: toBytes
 * @Description: 对象转byte数组
 * @author Jecced
 * @param obj
 * @return
 */
public static <T> byte[] toBytes(T obj) {
    try {
        return mapper.writeValueAsBytes(obj);
    } catch (JsonProcessingException e) {
        e.printStackTrace();
    }
    return null;
}

/**
 * @Title: toList
 * @Description: byte转list集合
 * @author Jecced
 * @param bytes
 * @param clazz
 * @return
 */
public static <T> List<T> toList(byte[] bytes, Class<T> clazz) {
    List<T> list = null;
    try {
        list = mapper.readValue(bytes, MsgPackUtil.List(clazz));
    } catch (IOException e) {
        list = new ArrayList<>();
        e.printStackTrace();
    }
    return list;
}

/**
 * @Title: toObject
 * @Description: byte转指定对象
 * @author Jecced
 * @param bytes
 * @param clazz
 * @return
 */
public static <T> T toObject(byte[] bytes, Class<T> clazz) {
    T value = null;
    try {
        value = mapper.readValue(bytes, clazz);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return value;
}

/**
 * @Title: List
 * @Description: 私有方法,获取泛型的TypeReference
 * @author Jecced
 * @param clazz
 * @return
 */
private static <T> JavaType List(Class<?> clazz) {
    return mapper.getTypeFactory().constructParametricType(ArrayList.class, clazz);
}

} `

heliteng avatar May 17 '18 02:05 heliteng

@komamitsu I use msgpack-java version is 0.8.16 , which version msgpack-c match 0.8.16 ?

heliteng avatar May 17 '18 04:05 heliteng

I'm not sure if msgpack-c is compatible with msgpack-java:0.8.

  • actual values in byte array s

This information would be helpful to know that.

komamitsu avatar May 17 '18 06:05 komamitsu

msgpack-java:0.7+ incompatible msgpack-c,

depended on an internal order of Java class's variables

but msgpack-java:0.6 have a big bug issues #447

how unpack msg form c++/c by java?

heliteng avatar May 17 '18 09:05 heliteng