方法一:
本人为调用dubbo 接口,返回一个HashMap<Object,List<Student>>对象, 在反序列化map的时候出现问题,
解决方法为 把返回的对象封装成对象 再返回
方法二: 人家提供的一个方法
传输的数据为
@Data public class ResultBean implements Serializable { private static final long serialVersionUID = 7316712281088805027L; /** * 返回标识 正常返回为正数 异常为负数 */ private Integer code; /** * 返回文字描述 */ private String message; /** * 返回数据 */ private Serializable result; public ResultBean() { } public ResultBean(Integer code, String message) { this.code = code; this.message = message; } public ResultBean(Integer code, String message, Serializable result) { this.code = code; this.message = message; this.result = result; } }
dubbo provider 代码
@Override
public ResultBean resultBean() { HashMap<String, Object> map = new HashMap<>(); map.put("username", "xiaoyong"); return new ResultBean(1, "hello world", map); }
dubbo consumer 调用resultBean 时 会报一下错误
Caused by: com.alibaba.com.caucho.hessian.io.HessianProtocolException: com.alibaba.com.caucho.hessian.io.ObjectDeserializer: unexpected object java.lang.String (username) at com.alibaba.com.caucho.hessian.io.AbstractDeserializer.error(AbstractDeserializer.java:131) at com.alibaba.com.caucho.hessian.io.AbstractDeserializer.readMap(AbstractDeserializer.java:111) at com.alibaba.com.caucho.hessian.io.AbstractDeserializer.readMap(AbstractDeserializer.java:119) at com.alibaba.com.caucho.hessian.io.Hessian2Input.readObject(Hessian2Input.java:2093) at com.alibaba.com.caucho.hessian.io.Hessian2Input.readObject(Hessian2Input.java:2074) at com.alibaba.com.caucho.hessian.io.JavaDeserializer$ObjectFieldDeserializer.deserialize(JavaDeserializer.java:406)
原因是 ObjectDeserializer这个类没有实现readMap方法 解决方法 重写 ObjectDeserializer
package com.alibaba.com.caucho.hessian.io; import java.io.IOException; public class ObjectDeserializer extends AbstractDeserializer { private Class _cl; private MapDeserializer mapDeserializer; // 新加的代码 public ObjectDeserializer(Class cl) { _cl = cl; mapDeserializer = new MapDeserializer(cl); // 新加的代码 } /** 新加的代码 begin */ @Override public Object readMap(AbstractHessianInput in) throws IOException { return readMap(in, null, null); } @Override public Object readMap(AbstractHessianInput in, Class<?> expectKeyType, Class<?> expectValueType) throws IOException { return this.mapDeserializer.readMap(in, expectKeyType, expectValueType); } /** 新加的代码 end */ @Override public Class getType() { return _cl; } @Override public Object readObject(AbstractHessianInput in) throws IOException { return in.readObject(); } @Override public Object readObject(AbstractHessianInput in, String[] fieldNames) throws IOException { throw new UnsupportedOperationException(String.valueOf(this)); } @Override public Object readList(AbstractHessianInput in, int length) throws IOException { throw new UnsupportedOperationException(String.valueOf(this)); } @Override public Object readLengthList(AbstractHessianInput in, int length) throws IOException { throw new UnsupportedOperationException(String.valueOf(this)); } @Override public String toString() { return getClass().getSimpleName() + "[" + _cl + "]";