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

序列化和反序列化具有vavr列表的Java对象

松钊
2023-03-14
@Value
@Builder(toBuilder = true)
public class Customer {

    private final List<Remark> remarks;

}
    { "remarks" : {
        "empty" : true,
        "lazy" : false,
        "async" : false,
        "traversableAgain" : true,
        "sequential" : true,
        "ordered" : false,
        "singleValued" : false,
        "distinct" : false,
        "orNull" : null,
        "memoized" : false
      } 
    }

其中备注是对象内部的vavr列表字段。

现在,如果尝试将相同的值反序列化到对象objectmapper.readvalue(json,customer.class)中,则会出现错误:

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `io.vavr.collection.List` 
(no Creators, like default construct, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information
 at [Source: (String)"{"remarks" : {

当尝试反序列化时,为什么serified JSON文本不起作用?

  @Test
  public void mapperForVavrList() throws JsonProcessingException {
    Customer cus = Customer.builder().remarks(List.empty()).build();

    ObjectWriter ow = new ObjectMapper()
      .writer().withDefaultPrettyPrinter();

    String json1 = ow.writeValueAsString(cus);

    log.info(json1);

    ObjectMapper objectMapper = new ObjectMapper();
    Customer cus2 = objectMapper.readValue(json1, Customer.class);

    log.info(cus2.toString());

  }

在Java代码中有没有其他方法可以将vavr对象打印成文本格式并将其转换回POJO?

共有1个答案

养慈
2023-03-14

您可以使用Jackson轻松地将vavr对象序列化/反序列化到JSON/将vavr对象从JSON序列化。您需要做的是在ObjectMapper的实例上注册VAVRModule:

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new VavrModule());

要获得vavrmodule,您需要将依赖项添加到vavr-jackson

编辑

import com.fasterxml.jackson.databind.ObjectMapper;
import io.vavr.collection.List;
import io.vavr.jackson.datatype.VavrModule;
import org.apache.commons.lang3.builder.ToStringBuilder;

import java.io.IOException;

class Lol2 {

    public static void main(String[] args) throws IOException {
        Customer c = new Customer();
        Remark r = new Remark();
        r.whatever = "whatever";
        c.remarks = List.of(r);

        ObjectMapper ow = new ObjectMapper();
        ow.registerModule(new VavrModule());

        System.out.println(c);
        String json = ow.writeValueAsString(c);
        System.out.println(json);
        Customer c2 = ow.readValue(json, Customer.class);
        System.out.println(c2);

    }
}

class Customer {

    List<Remark> remarks;

    public List<Remark> getRemarks() {
        return remarks;
    }

    public void setRemarks(List<Remark> remarks) {
        this.remarks = remarks;
    }

    @Override
    public String toString() {
        return new ToStringBuilder(this)
            .append("remarks", remarks)
            .toString();
    }
}

class Remark {

    String whatever;

    public String getWhatever() {
        return whatever;
    }

    public void setWhatever(String whatever) {
        this.whatever = whatever;
    }

    @Override
    public String toString() {
        return new ToStringBuilder(this)
            .append("whatever", whatever)
            .toString();
    }
}

 类似资料:
  • 本文向大家介绍java对象的序列化和反序列化,包括了java对象的序列化和反序列化的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了java对象的序列化和反序列化,供大家参考,具体内容如下 1. 什么是序列化        将对象转换为字节流保存起来,比如保存到文件里,并在以后还原这个对象,这种机制叫做对象序列化。(补充一句:把对象保存到永久存储设备上称为持久化) 2. 怎么实现序列化

  • 主要内容:1 Java序列化和反序列化,2 Java序列化的优点,3 java.io.Serializable接口,4 Java ObjectOutputStream,5 Java ObjectInputStream,6 Java序列化的例子,7 Java反序列化的例子1 Java序列化和反序列化 Java中的序列化是一种将对象状态写入字节流的机制。它主要用于Hibernate,RMI,JPA,EJB和JMS技术。 序列化的反向操作称为反序列化,其中字节流被转换为对象。序列化和反序列化过程与平台

  • 本文向大家介绍详解Java 对象序列化和反序列化,包括了详解Java 对象序列化和反序列化的使用技巧和注意事项,需要的朋友参考一下 之前的文章中我们介绍过有关字节流字符流的使用,当时我们对于将一个对象输出到流中的操作,使用DataOutputStream流将该对象中的每个属性值逐个输出到流中,读出时相反。在我们看来这种行为实在是繁琐,尤其是在这个对象中属性值很多的时候。基于此,Java中对象的序列

  • 上下文:我们使用Activiti作为流程引擎,使用Activiti-Rest作为应用程序的接口。由于这个问题与返回由Java序列化的对象的REST服务有关,所以我没有将其添加到标题中。 场景:我们有一个JBoss Wildfly实例,它包含一个EAR和一个包含类“ProcessContext”的模块(为了参考,我们将其称为X)。Activiti在这个EAR中运行,ServiceTasks(从进程中

  • 我已经开始将一个项目从使用Java标准日期迁移到Joda DateTime。 我的项目使用XML序列化将对象保存到XML文件中。在这个特殊的例子中,我有一个Item类,它有一个DateTime属性。 在某个时候,我正在初始化对象,包括像这样的DateTime属性: 我使用XMLEncoder使用辅助类序列化项目: 显然,日期时间被保存在xml中。。。但毫无价值: 显然,它没有保存任何东西,但不,它