MessagePack:MessageTypeException:预期的原始值,但得到布尔值 [Android]
MessagePack : MessageTypeException: Expected raw value, but got boolean [Android]
我正在 android 应用程序中实施 MessagePack。仅当应用 运行s 在 API 22 台设备以下时反序列化响应数据时出现以下错误;
Caused by: org.msgpack.MessageTypeException: Expected raw value, but got boolean
at org.msgpack.unpacker.Accept.acceptBoolean(Accept.java:33)
at org.msgpack.unpacker.MessagePackUnpacker.readOneWithoutStackLarge(MessagePackUnpacker.java:154)
at org.msgpack.unpacker.MessagePackUnpacker.readOneWithoutStack(MessagePackUnpacker.java:139)
at org.msgpack.unpacker.MessagePackUnpacker.readOne(MessagePackUnpacker.java:73)
at org.msgpack.unpacker.MessagePackUnpacker.readString(MessagePackUnpacker.java:472)
at org.msgpack.template.StringTemplate.read(StringTemplate.java:46)
at org.msgpack.template.StringTemplate.read(StringTemplate.java:25)
at org.msgpack.template.builder.ReflectionTemplateBuilder$FieldTemplateImpl.read(ReflectionTemplateBuilder.java:70)
at org.msgpack.template.builder.ReflectionTemplateBuilder$ReflectionClassTemplate.read(ReflectionTemplateBuilder.java:143)
如果我 运行 在 API 22 或更高版本的设备中使用相同的应用程序一切正常。
以下代码用于反序列化;
private T readMessagePack(byte[] response, Class<T> responseType) throws Exception
{
MessagePack msgpack = new MessagePack();
TemplateRegistry registry = new TemplateRegistry(null);
ReflectionTemplateBuilder builder = new ReflectionTemplateBuilder(registry);
Template<T> objTemplate = builder.buildTemplate(responseType);
BufferUnpacker unpacker = msgpack.createBufferUnpacker();
unpacker.resetReadByteCount();
unpacker.wrap(response);
return objTemplate.read(unpacker, null);
}
我正在使用 org.msgpack:msgpack:0.6.8
依赖项。
经过研究,我解决了我的问题。可能我的回答对某些人有帮助。
此问题是由 BufferUnpacker returns 声明字段的顺序引起的。为此,我们必须在序列化和反序列化时使用 @Index()
注释。
例如;
@Index(0)
public boolean state;
@Index(1)
public String error_message;
我正在 android 应用程序中实施 MessagePack。仅当应用 运行s 在 API 22 台设备以下时反序列化响应数据时出现以下错误;
Caused by: org.msgpack.MessageTypeException: Expected raw value, but got boolean
at org.msgpack.unpacker.Accept.acceptBoolean(Accept.java:33)
at org.msgpack.unpacker.MessagePackUnpacker.readOneWithoutStackLarge(MessagePackUnpacker.java:154)
at org.msgpack.unpacker.MessagePackUnpacker.readOneWithoutStack(MessagePackUnpacker.java:139)
at org.msgpack.unpacker.MessagePackUnpacker.readOne(MessagePackUnpacker.java:73)
at org.msgpack.unpacker.MessagePackUnpacker.readString(MessagePackUnpacker.java:472)
at org.msgpack.template.StringTemplate.read(StringTemplate.java:46)
at org.msgpack.template.StringTemplate.read(StringTemplate.java:25)
at org.msgpack.template.builder.ReflectionTemplateBuilder$FieldTemplateImpl.read(ReflectionTemplateBuilder.java:70)
at org.msgpack.template.builder.ReflectionTemplateBuilder$ReflectionClassTemplate.read(ReflectionTemplateBuilder.java:143)
如果我 运行 在 API 22 或更高版本的设备中使用相同的应用程序一切正常。
以下代码用于反序列化;
private T readMessagePack(byte[] response, Class<T> responseType) throws Exception
{
MessagePack msgpack = new MessagePack();
TemplateRegistry registry = new TemplateRegistry(null);
ReflectionTemplateBuilder builder = new ReflectionTemplateBuilder(registry);
Template<T> objTemplate = builder.buildTemplate(responseType);
BufferUnpacker unpacker = msgpack.createBufferUnpacker();
unpacker.resetReadByteCount();
unpacker.wrap(response);
return objTemplate.read(unpacker, null);
}
我正在使用 org.msgpack:msgpack:0.6.8
依赖项。
经过研究,我解决了我的问题。可能我的回答对某些人有帮助。
此问题是由 BufferUnpacker returns 声明字段的顺序引起的。为此,我们必须在序列化和反序列化时使用 @Index()
注释。
例如;
@Index(0)
public boolean state;
@Index(1)
public String error_message;