[alibaba/fastjson]fastjson的自定义序列化和反序列化的方案并不优雅

2025-11-24 247 views
0

自定义序列化和反序列化需要每个类都put一次 如果我是自定义的枚举类型,但是都实现了统一接口,如 public enum LoginByWxResultDic implements BaseEnum { SUCCESS(1), FAIL(0), ..... ..... } 各个项目中不知有多少的这种枚举,每个都要在工具类中引入?这种方案不能实用

回答

4

你要实现自定义序列化的方式大致是怎样的?我看看现有的功能能否满足你的需求?你有好的建议也希望能告诉我哈

0

回复好快,赞 我在spring mvc中使用fastjson,一般会用restful给其它系统提供服务调用,这时候通常会定义一些协议,例如,返回1表示成功,0表示表示失败,-1又参数错误等等 为了在程序中更容易看懂并防错,这时候我就用枚举来定义,而且用了自定义枚举,代码如主题上说的 它们都实现了一个统一的自定义接口(BaseEnum) 我建议能不能判断如果是这个接口的,就调用配置自定义的序列化和反序列化的代码 我试了 fastJsonConfig.getSerializeConfig().put(BaseEnum.class, new EnumSerializer()); fastJsonConfig.getParserConfig().putDeserializer(BaseEnum.class, new EnumSerializer()); 貌似不行

8

可以实现这个接口:

/**
 * 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();
}
1

实现JSONAware接口是可以实现,如果是自定义接口就更好了

4

还有,JSONAware是序列化的,那反序列化呢?用哪个接口?

4

序列化也用JSONAware 出列了. 但是反序列化看起来挺麻烦的.

看了代码是用System.identifyHashCode() 做反序列化类的key .

项目中扫描所有枚举去处理的方式很不优雅

7

Java8中可以在自定义接口继承JSONAware, 用java8默认方法的特性实现

2

反序列化貌似无解? @wenshao

2

~~实在是不太好用,能不能像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/

8

` 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);
}

}

`

0

serializeConfig.put 自定义的序列化器,并不能执行,不知道是顺序问题还是class没能判断是父类