首页 > 解决方案 > 如何序列化 JsonNode

问题描述

我将以下实例保存到 Aerospike 数据库。我要序列化的课程

public class School  implements Serializable {
    private static final long serialVersionUID = 1L;

    private JsonNode studentInfo;

    private JsonNode teacherInfo;

    private void writeObject(ObjectOutputStream out) throws IOException {
        ObjectMapper mapper = new ObjectMapper();

        mapper.writeValue((OutputStream) out, studentInfo);
        mapper.writeValue((OutputStream) out, teacherInfo);

    }

    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
        ObjectMapper mapper = new ObjectMapper();

        this.studentInfo = mapper.readValue((InputStream) in, JsonNode.class);
        this.teacherInfo = mapper.readValue((InputStream) in, JsonNode.class);
    }
}

使用上面的代码,保存到数据库工作正常(序列化)。

但是当我尝试从数据库(反序列化)中获取数据时,我面临以下异常。

Caused by: com.aerospike.client.AerospikeException$Serialize: Error -10,1,30000,0,5,BB95B2FFB6EA79A 10.66.29.66 3030: ***com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input***
 at [Source: java.io.ObjectInputStream@6ff29830; line: 1, column: 0]
    at com.aerospike.client.command.Buffer.bytesToObject(Buffer.java:341)
    at com.aerospike.client.command.Buffer.bytesToParticle(Buffer.java:69)

如果我遗漏了什么,请告诉我。

标签: serializationdeserializationaerospike

解决方案


我认为我们不能多次使用 ObjectOutputStream 和 ObjectInputStream。我通过编写writeObjectreadObject函数解决了它。

private void writeObject(ObjectOutputStream out) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
       
        ArrayNode arrayNode = mapper.createArrayNode().add(this.studentInfo).add(this.teacherInfo);

        mapper.writeValue((OutputStream) out, arrayNode);
    }
    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
        ObjectMapper mapper = new ObjectMapper();
        ArrayNode arrayNode = null;
        arrayNode = mapper.readValue((InputStream) in, ArrayNode.class);
        this.studentInfo = arrayNode.studentInfo;
        this.teacherInfo = arrayNode.teacherInfo;
    }

或者您可以创建一个具有 2 个字段的 POJO 作为 JsonNode 并序列化 POJO。


推荐阅读