我有一个场景,我将对象推送到队列,该队列将在另一端读取。
我正在将对象转换为字符串,将字符串转换为字节。将这些字节插入队列。
CollectionObject collectionObject = new CollectionObject();
// This can be any Object. Or at least Iam thinking it's Object class.
collectionObject.setName("Sienna");
String customerMessage = objectMapper.writeValueAsString(collectionObject);
byte[] msg = customerMessage.getBytes(StandardCharsets.UTF_8);
另一方面,我正在以这种方式读取这个对象。
String messageFromQueue = new String(msg);
objectMapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
Object genericObject = objectMapper.readValue(messageFromQueue, new TypeReference<Object>(){});
System.out.println("let's see object"+genericObject);
if(genericObject instanceof CollectionObject)
System.out.println("turned out to be collectionObject "+genericObject);
但是 check 的实例永远不会被满足。 readValue 返回 LinkedHashMap 对象。
任何帮助, 谢谢
最佳答案
问题
没有任何内容指示要编码到的类:{"name":"Sienna"}
。 fastxml 怎么可能猜测它应该编码到哪种类型。
一种解决方案
首先启用默认输入:
objectMapper.enableDefaultTyping();
然后考虑在实际负载周围使用包装对象:
public class Wrapper {
private Object content;
public Wrapper() {
}
public Wrapper(Object content) {
this.content = content;
}
public Object getContent() {
return content;
}
public void setContent(Object content) {
this.content = content;
}
}
然后写入对象:
String customerMessage = objectMapper.writeValueAsString(new Wrapper(collectionObject));
然后读取对象:
Object genericObject = objectMapper.readValue(messageFromQueue, Wrapper.class).getContent();
在这种情况下,genericObject
将是一个CollectionObject
,并且json是{"content":["CollectionObject",{"name":"Sienna"}]}
关于java - ObjectMapper - 读/写通用对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53335717/