方法一:
本人為調用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 + "]";