之前,定义rpc接口协议,一直觉得某些特殊含义的属性字段用枚举类比较合适。调用方只需要引用你提供的jar包,按照不同场景传入枚举值即可很方便。但最近感觉有一定的风险。
起因:
做需求和服务下游联调,其中一个接口属性就是枚举值。定义值后,我这边对枚举值又新增了一个含义。类似代码如下:
public enum TypeEnum {
/**
* 新增的默认值
*/
DEFAULT(0),
/**
* 有含义
*/
ONE(1),
;
private int code;
TypeEnum(int code) {
this.code = code;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
}
由于,新增枚举值后,下游没有更新最新jar,传输过程中报了类似如下报错:
Can not deserialize value of type com.yueyue.order.driver.enums.TypeEnum from String "DEFAULT": value not one of declared Enum instance names: [ONE]
at [Source: "DEFAULT"; line: 1, column: 1]
意思是说,返序列过程中,对应的枚举值DEFAULT转换不了对应的枚举类型TypeEnum。
思考:
1.该枚举类后续扩展,如果其他服务用到,升级jar包后,那么可能就会出现此类问题。
2.也有可能对应下游业务扩展,调用方rpc接口服务先升级,切分批升级,如果有流量被打开,也是有此类问题的。
3.对应此类问题,存在序列化和反序列化还有数据库Json格式存枚举,也有可能有此类问题。
等等
结论:
后续开发过程中,设计序列化与反序列化传输的功能,尽量避免使用枚举类做属性。避免上述问题。