使JsonNode可序列化

这似乎很简单,但我没有得到序列化的JsonNode反序列化。 这是我的测试课

import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; public class Foo implements Serializable { private String string; private transient JsonNode jsonNode; public Foo(String string, JsonNode jsonNode) { this.string = string; this.jsonNode = jsonNode; } private void writeObject(ObjectOutputStream out) throws IOException { out.defaultWriteObject(); if (this.jsonNode != null) out.writeObject((new ObjectMapper()).writeValueAsBytes(this.jsonNode)); // out.writeObject(this.jsonNode.textValue()); } private void readObject(ObjectInputStream in) throws IOException,ClassNotFoundException { in.defaultReadObject(); this.jsonNode = (new ObjectMapper()).readValue(in, JsonNode.class); } } 

当我试图反序列化时,我得到了这个错误

 com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input 

这是unit testing

 import com.fasterxml.jackson.databind.node.JsonNodeFactory; import com.fasterxml.jackson.databind.node.ObjectNode; import org.testng.annotations.Test; import java.io.*; import static org.testng.Assert.assertEquals; public class FooTest { @Test public void testSerialization() { JsonNodeFactory nodeFactory = new JsonNodeFactory(false); ObjectNode node = nodeFactory.objectNode(); ObjectNode child = nodeFactory.objectNode(); // the child child.put("message", "test"); node.put("notification", child); Foo foo = new Foo("Bar", node); String fileName = "foo.ser"; try ( OutputStream file = new FileOutputStream(fileName); OutputStream buffer = new BufferedOutputStream(file); ObjectOutput output = new ObjectOutputStream(buffer); ){ output.writeObject(foo); } catch(IOException ex){ ex.getStackTrace(); } Foo fooNew = null; //deserialize the ser file try( InputStream file = new FileInputStream(fileName); InputStream buffer = new BufferedInputStream(file); ObjectInput input = new ObjectInputStream (buffer); ){ //deserialize the Object fooNew = (Foo) input.readObject(); } catch(ClassNotFoundException ex){ ex.printStackTrace(); } catch(IOException ex){ ex.printStackTrace(); } assertEquals(foo, fooNew); } } 

您的读写操作不匹配。

在写入端,您使用ObjectOutputStream.writeObject(Object)来编写包含序列化JSON内容的byte[] 。 在读取端ObjectMapper.readValue(InputStream, Class)当您实际需要首先读取byte[]对象时ObjectMapper.readValue(InputStream, Class)尝试使用ObjectMapper.readValue(InputStream, Class)读取流中的原始字节ObjectMapper.readValue(InputStream, Class)因为这是您编写的,然后使用ObjectMapper.readValue(byte[], Class)

或者,可能更好的解决方案是您可以在写入端使用ObjectMapper.writeValue(OutputStream, Object)

尝试这个:

 private void writeObject(ObjectOutputStream out) throws IOException { out.defaultWriteObject(); if(jsonNode == null){ out.writeBoolean(false); } else { out.writeBoolean(true); new ObjectMapper().configure(JsonGenerator.Feature.AUTO_CLOSE_TARGET, false).writeValue(out, jsonNode); } } private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { in.defaultReadObject(); if(in.readBoolean()){ this.jsonNode = new ObjectMapper().configure(JsonParser.Feature.AUTO_CLOSE_SOURCE, false).readValue(in, JsonNode.class); } }