自定义序列化和反序列化需要每个类都put一次 如果我是自定义的枚举类型,但是都实现了统一接口,如 public enum LoginByWxResultDic implements BaseEnum { SUCCESS(1), FAIL(0), ..... ..... } 各个项目中不知有多少的这种枚举,每个都要在工具类中引入?这种方案不能实用
[alibaba/fastjson]fastjson的自定义序列化和反序列化的方案并不优雅
回答
你要实现自定义序列化的方式大致是怎样的?我看看现有的功能能否满足你的需求?你有好的建议也希望能告诉我哈
回复好快,赞 我在spring mvc中使用fastjson,一般会用restful给其它系统提供服务调用,这时候通常会定义一些协议,例如,返回1表示成功,0表示表示失败,-1又参数错误等等 为了在程序中更容易看懂并防错,这时候我就用枚举来定义,而且用了自定义枚举,代码如主题上说的 它们都实现了一个统一的自定义接口(BaseEnum) 我建议能不能判断如果是这个接口的,就调用配置自定义的序列化和反序列化的代码 我试了 fastJsonConfig.getSerializeConfig().put(BaseEnum.class, new EnumSerializer()); fastJsonConfig.getParserConfig().putDeserializer(BaseEnum.class, new EnumSerializer()); 貌似不行
可以实现这个接口:
/**
* Beans that support customized output of JSON text shall implement this interface.
*
* @author wenshao[szujobs@hotmail.com]
*/
public interface JSONAware {
/**
* @return JSON text
*/
String toJSONString();
}
实现JSONAware接口是可以实现,如果是自定义接口就更好了
还有,JSONAware是序列化的,那反序列化呢?用哪个接口?
序列化也用JSONAware 出列了. 但是反序列化看起来挺麻烦的.
看了代码是用System.identifyHashCode() 做反序列化类的key .
项目中扫描所有枚举去处理的方式很不优雅
Java8中可以在自定义接口继承JSONAware, 用java8默认方法的特性实现
反序列化貌似无解? @wenshao
~~实在是不太好用,能不能像jackson一样,用两个注解完事呢? JSONCreator 和 JSONValue,这都是绑定在类上的。 另外,序列化可以用JSONAware,那么反序列化可以用什么呢?~~ 更新一下,这个问题后来解决了,今天写博客时候顺手写上了,希望后来人看到不要浪费时间 https://ruiruigeblog.com/2018/08/05/FastJson%E4%BD%BF%E7%94%A8Serializer%E5%92%8CDeserializer%E5%AE%9E%E7%8E%B0%E6%9E%9A%E4%B8%BE%E7%B1%BB%E8%87%AA%E5%AE%9A%E4%B9%89%E5%BA%8F%E5%88%97%E5%8C%96/
` serializeConfig.put(IEnum.class, new ObjectSerializer(){ // @Override // public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) { // if (object == null){ // return; // } // // SerializeWriter out = serializer.out; // IEnum iEnum = (IEnum) object; // Object value = iEnum.getValue(); // // if (value instanceof Byte){ // out.write((byte)value); // } // else if (value instanceof Character){ // out.write((Character)value); // } // else if (value instanceof Short){ // out.write((Short)value); // } // else if (value instanceof Integer){ // out.writeInt((Integer) value); // } // else if (value instanceof Float){ // out.writeFloat((float)value, false); // } // else if (value instanceof Double){ // out.writeDouble((double)value, false); // } // else if (value instanceof Long){ // out.writeLong((long)value); // } // else if (value instanceof Boolean){ // out.write((boolean)value); // } // else { // out.writeString(value.toString()); // } // } // }); 我现在也是遇到这个问题, 我也是所有的枚举都实现了IEnum接口, 我像上面这样put, ASMSerializer并没有执行我这个序列化器,
然后我换成了jackson是可以的 SimpleModule simpleModule = new SimpleModule(); simpleModule.addSerializer(IEnum.class, new IEnumSerializer()); mapper.registerModule(simpleModule);
public class IEnumSerializer extends JsonSerializer {
@Override
public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
IEnum iEnum = (IEnum) o;
Serializable value = iEnum.getValue();
jsonGenerator.writeObject(value);
}
}
`
serializeConfig.put 自定义的序列化器,并不能执行,不知道是顺序问题还是class没能判断是父类