栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在运行时以自定义方式对(De-)Serialize Bean

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在运行时以自定义方式对(De-)Serialize Bean

我认为

@JsonSerialize
@JsonDeserialize
这就是您所需要的。这些注释使您可以控制特定字段的序列化/反序列化。这个问题展示了将它们组合为一个注释的优雅方法。

UPD。
对于这种复杂的情况,您可以看一下

BeanSerializerModifier/BeanDeserializerModifier
类。这个想法是
BeanSerializer/BeanDeserializer
使用特定字段的自定义逻辑来修改常规,然后让基本实现来做其他事情。稍后再发布示例。

UPD2。 如我所见,一种方法可能是使用

changeProperties
method并分配自己的序列化程序。

UPD3。 更新了自定义序列化程序的工作示例。反序列化可以类似的方式进行。

UPD 4。 更新了具有完全自定义序列化/反序列化的示例。(我用过 jakson-mapper-asl-1.9.8

  public class TestBeanSerializationModifiers {    static final String PropertyName = "customProperty";    static final String CustomValue = "customValue";    static final String basevalue = "basevalue";    // Custom serialization    static class CustomSerializer extends JsonSerializer<Object> {        @Override        public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { String customValue = CustomValue; // someService.getCustomValue(value); jgen.writeString(customValue);        }    }    static class MyBeanSerializerModifier extends BeanSerializerModifier {        @Override        public List<BeanPropertyWriter> changeProperties(SerializationConfig config, BasicBeanDescription beanDesc, List<BeanPropertyWriter> beanProperties) { for (int i = 0; i < beanProperties.size(); i++) {     BeanPropertyWriter beanPropertyWriter = beanProperties.get(i);     if (PropertyName.equals(beanPropertyWriter.getName())) {         beanProperties.set(i, beanPropertyWriter.withSerializer(new CustomSerializer()));     } } return beanProperties;        }    }    // Custom deserialization    static class CustomDeserializer extends JsonDeserializer<Object> {        @Override        public Object deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException { // serialized value, 'customValue' String serializedValue = jp.getText(); String basevalue = basevalue; // someService.restoreOldValue(serializedValue); return basevalue;        }    }    static class MyBeanDeserializerModifier extends BeanDeserializerModifier {        @Override        public BeanDeserializerBuilder updateBuilder(DeserializationConfig config, BasicBeanDescription beanDesc, BeanDeserializerBuilder builder) { Iterator<SettableBeanProperty> beanPropertyIterator = builder.getProperties(); while (beanPropertyIterator.hasNext()) {     SettableBeanProperty settableBeanProperty = beanPropertyIterator.next();     if (PropertyName.equals(settableBeanProperty.getName())) {         SettableBeanProperty newSettableBeanProperty = settableBeanProperty.withValueDeserializer(new CustomDeserializer());         builder.addOrReplaceProperty(newSettableBeanProperty, true);         break;     } } return builder;        }    }    static class Model {        private String customProperty = basevalue;        private String[] someArray = new String[]{"one", "two"};        public String getCustomProperty() { return customProperty;        }        public void setCustomProperty(String customProperty) { this.customProperty = customProperty;        }        public String[] getSomeArray() { return someArray;        }        public void setSomeArray(String[] someArray) { this.someArray = someArray;        }    }    public static void main(String[] args) {        SerializerFactory serializerFactory = BeanSerializerFactory     .instance     .withSerializerModifier(new MyBeanSerializerModifier());        DeserializerFactory deserializerFactory = BeanDeserializerFactory     .instance     .withDeserializerModifier(new MyBeanDeserializerModifier());        ObjectMapper objectMapper = new ObjectMapper();        objectMapper.setSerializerFactory(serializerFactory);        objectMapper.setDeserializerProvider(new StdDeserializerProvider(deserializerFactory));        try { final String fileName = "test-serialization.json"; // Store, "customValue" -> json objectMapper.writevalue(new File(fileName), new Model()); // Restore, "basevalue" -> model Model model = objectMapper.readValue(new File(fileName), Model.class);        } catch (IOException e) { e.printStackTrace();        }    }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/440928.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号