官方文档:
http://dubbo.apache.org/zh-cn/docs/user/references/protocol/dubbo.htm
缺省协议,使用基于 mina 1.1.7
和 hessian 3.2.1
的 tbremoting 交互。
约束
- 参数及返回值需实现
Serializable
接口 - 参数及返回值不能自定义实现
List
,Map
,Number
,Date
,Calendar
等接口,只能用 JDK 自带的实现,因为 hessian 会做特殊处理,自定义实现类中的属性值都会丢失。 - Hessian 序列化,只传成员属性值和值的类型,不传方法或静态变量,兼容情况 [1][2]:
如果RPC调用参数及返回值没有实现Serializable
接口会报异常:
Serialized class com.xxx.WaresBasicDO must implement java.io.Serializable
java.lang.IllegalStateException: Serialized class com.souche.mall.product.domain.WaresBasicDO must implement java.io.Serializable
at com.alibaba.com.caucho.hessian.io.SerializerFactory.getDefaultSerializer(SerializerFactory.java:395)
at com.alibaba.com.caucho.hessian.io.SerializerFactory.getSerializer(SerializerFactory.java:369)
at com.alibaba.com.caucho.hessian.io.Hessian2Output.writeObject(Hessian2Output.java:389)
at com.alibaba.dubbo.common.serialize.hessian2.Hessian2ObjectOutput.writeObject(Hessian2ObjectOutput.java:88)
我所在的项目进行项目的服务拆分,但是没有把各个服务模块单独部署,各服务模块dubbo的service API实际还是在同一个Spring容器中运行的,这个时候返回值没有实现Serializable
接口也没有报错,因为这实际上并不是RPC调用,并没有经过缺省协议的序列化流程。