当前位置: 首页 > 知识库问答 >
问题:

如何在不覆盖序列化方法的情况下为特定类重写 JsonSerializer 的 isEmpty 方法?

方和宜
2023-03-14

我想为isEmpty方法添加自定义行为。

当我从< code>JsonSerializer扩展时

我应该重写序列化方法,因为它是抽象的。

我想让序列化方法保持原样,只覆盖is空方法。

共有2个答案

邓禄
2023-03-14

最后,你无论如何都必须有一个serialize方法的实现,因为它是抽象的。如果至少有一个方法是抽象的,你就不能实例化你的类

陆雨华
2023-03-14

为了修改 isEmpty 行为但保持默认序列化,您可以利用序列化程序修饰符。您仍然必须实现自定义序列化程序,但您可以非常干净地使用默认序列化。

defaultSerializer变量注入到自定义序列化程序类中。当我们实现修饰符时,您将看到这个序列化程序的来源。在这个类中,您将重写<code>isEmpty</code>方法来完成您需要的任务。下面,如果<code>MySpecificClass</code>具有空的<code>id</code>,则Jackson将其视为空。

public class MySpecificClassSerializer extends JsonSerializer<MySpecificClass> {
    private final JsonSerializer<Object> defaultSerializer;

    public MySpecificClassSerializer(JsonSerializer<Object> defaultSerializer) {
        this.defaultSerializer = checkNotNull(defaultSerializer);
    }

    @Override
    public void serialize(MySpecificClass value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        defaultSerializer.serialize(value, gen, serializers);
    }

    @Override
    public boolean isEmpty(SerializerProvider provider, MySpecificClass value) {
        return value.id == null;
    }
}

扩展BeanSerializerModifier并重写modifySerializer方法。在该方法中,您可以筛选要操作的类类型,并相应地返回自定义序列化程序。

public class MyClassSerializerModifier extends BeanSerializerModifier {
    @Override
    public JsonSerializer<?> modifySerializer(SerializationConfig config, BeanDescription beanDesc, JsonSerializer<?> serializer) {
        if (beanDesc.getBeanClass() == MySpecificClass.class) {
            return new MySpecificClassSerializer((JsonSerializer<Object>) serializer);
        }
        return serializer;
    }
}

注册修饰符将允许您的序列化程序在满足中的条件时触发

ObjectMapper om = new ObjectMapper()
        .registerModule(new SimpleModule()
                .setSerializerModifier(new MyClassSerializerModifier()));
 类似资料:
  • 问题内容: 我想为 isEmpty 方法添加自定义行为。 当我从 我应该重写序列化方法,因为它是抽象的。 我想按原样保留序列化方法,并仅覆盖isEmpty方法。 问题答案: 为了修改行为但保持默认的序列化,您可以利用 serializer修饰符 。您仍然必须实现自定义序列化程序,但是可以非常干净地利用默认序列化程序。 使用默认的序列化器创建一个自定义序列化器 将变量插入到您的自定义序列化器类中。当

  • 我最近在浏览SurfaceView的android文档,我发现要获得实际的surface,你必须做以下事情: surface holder的文档在这里:https://developer . Android . com/reference/Android/view/surface holder . html 现在一个SurfaceHolder从getHolder()返回,然后你可以在那个支架上调用

  • 问题内容: 我需要一些有关ajax的liferay方面的帮助。现在,我正在从页面调用ajax方法来提交一些数据。 这是我正在使用的示例代码: 在我的课程中,有一种方法被此ajax调用所调用: 所以我的问题是,现在它只是通过任何ajax类的默认方法进行校准。但是如何在ajax调用中调用类的特定方法? 我是ajax的新蜜蜂。所以无论如何请引导我..... 使用以下网址调用ajax时出现以下错误 我的流

  • 我的A类是: 另一类B为: 如果我将类A的方法sayHello(int,int)的返回类型从int改为float,它会显示一个错误,因为根据覆盖规则,返回类型也被认为是无效的覆盖和重载。 我不明白为什么java不允许更改返回类型。为什么返回类型也需要相同

  • 这是我第二次使用它,也是我第一次得到非常好的帮助,所以我希望我能得到更多的帮助! 背景: 我的程序通过创建一个保存余额和其他东西的对象来测试我的 类。说明说我需要覆盖子类的“提款”和“存款”方法以跟踪交易。 我这样做了,但它不使用当前余额,而是只发送一个0。我希望能够保留新的余额,以便它实际从当前余额中提取或存款。 抱歉,如果这毫无意义,如果需要任何澄清,我将尝试以不同的方式解释。 以下是我的代码

  • 经过一些处理后,我得到了一个DStream[字符串,ArrayList[字符串]],所以当我使用saveAsTextFile将其写入hdfs时,每个批处理后它都会覆盖数据,所以如何通过附加到以前的结果来写入新结果 编辑:: 如果有人可以帮助我将输出转换为avro格式,然后写入HDFS并附加