Skip to content

序列化和反序列化嵌套结构体 throw “Expected array, but got raw value” error. msgpack是否支持嵌套结构体的序列化和反序列化 #813

Open
@zlp821130

Description

@zlp821130

我在C++端序列化nested struct RequestBody,并发送到Java端反序列化
C++结构体和序列化方法如下:
struct RESP_GHM {
int uiYear; // 年
char szMs[3]; // 毫秒

MSGPACK_DEFINE(uiYear, szMs);  // 定义要序列化的成员

};

/*

  • @brief 测试消息体结构体
    */
    struct RequestBody
    {
    int id;
    string msg;
    vector usCmdWork;
    vector usTestString;
    short usWave[3][4];
    RESP_GHM ghm;

    MSGPACK_DEFINE(id, msg, usCmdWork, usTestString, usWave, ghm); // 定义要序列化的成员
    };

// 序列化方法
template
string MsgpackSerialize(const T& obj) {

stringstream buffer;

// 序列化数据
pack(buffer, obj);
buffer.seekg(0);

string bufferStr(buffer.str());

return bufferStr;

};

Java端反序列化代码如下

// java反序列化代码
public T deserialize(byte[] data, String classOfT) throws CodecException {

    Object resultObject = null;
    MessagePack messagePack = new MessagePack();

    try {
        Class<?> clazz = Class.forName(classOfT);
        resultObject = messagePack.read(data, clazz);

    } catch (ClassNotFoundException e) {
        throw new CodecException(
                classOfT + " ClassNotFoundException occurred when Msgpack serializer decode!", e);
    } catch (IOException e) {
        throw new CodecException("IOException occurred when Msgpack serializer decode!", e);
    }

    return (T) resultObject;
}

执行到resultObject = messagePack.read(data, clazz); //throw “Expected array, but got raw value”。

注: 如果RequestBody中不嵌套RESP_GHM 结构体,Java端能够正常反序列化,msgpack是否支持嵌套结构体的序列化和反序列化?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions