我想使用通用模型在websocket上从服务器到客户端广播不同的数据。 Unfortunatley我总是在想要序列化以下类结构时遇到错误:
使用SimpleJson序列化的类:
public class UpdateBroadcastMessageData {
private List<UpdateBroadcastModel<? extends Object>> models = new ArrayList<UpdateBroadcastModel<? extends Object>>();
public void clearModels() {
...
}
public void addModel(Object model) {
...
}
public void removeModel(Object model) {
...
}
}
public class UpdateBroadcastModel<T extends Object> {
private String clazz = null;
private T payload = null;
...
}
我的JsonUtil类总是抛出“无法转换为JSon”的消息。
import org.codehaus.jackson.map.ObjectMapper;
public class JsonUtil {
private static ObjectMapper mapper = new ObjectMapper();
public static String convertToJson(Object object) {
try {
return mapper.writeValueAsString(object);
} catch (Exception e) {
log.error("Could not convert Object to JSON", e);
return "";
}
}
public static <T> T convertToObject(String json, Class<T> clazz) {
try {
return mapper.readValue(json, clazz);
} catch (Exception e) {
log.error("Could not convert JSON to Object", e);
return null;
}
}
}
有人可以帮助我并告诉我如何处理以上数据结构的序列化吗?
错误是指converttoJson方法。这是堆栈跟踪:
ERROR [pool-3-thread-1][JsonUtil:16] Could not convert Object to JSON
org.codehaus.jackson.map.JsonMappingException: No serializer found for class
...UpdateBroadcastMessageData and no properties discovered to create BeanSerializer
(to avoid exception, disable SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS) )
at org.codehaus.jackson.map.ser.StdSerializerProvider$1.serialize(StdSerializerProvider.java:62)
at org.codehaus.jackson.map.ser.StdSerializerProvider._serializeValue(StdSerializerProvider.java:296)
at org.codehaus.jackson.map.ser.StdSerializerProvider.serializeValue(StdSerializerProvider.java:224)
at org.codehaus.jackson.map.ObjectMapper._configAndWriteValue(ObjectMapper.java:1512)
at org.codehaus.jackson.map.ObjectMapper.writeValueAsString(ObjectMapper.java:1262)
at ...JsonUtil.convertToJson(JsonUtil.java:14)
at ...CommitPoiTokenAction.doProcess(CommitPoiTokenAction.java:118)
at ...BaseWebSocketTokenAction.processMessage(BaseWebSocketTokenAction.java:29)
at ...WebSocketListener$1.run(WebSocketListener.java:145)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
pool-3-thread-1: code=81 len=118
提前致谢。 faiko
答案 0 :(得分:0)
在方法中声明你的ObjectMapper
而不是类。
正如您在堆栈跟踪中看到的那样,错误是由org.codehaus.jackson.map.ObjectMapper...
在尝试序列化时引起的。如果你没有在方法上声明它,你没有对象映射器,因为你没有使用构造函数实例化你的对象,然后你没有映射器。
public static String convertToJson(Object object) {
ObjectMapper mapper = new ObjectMapper();
try {
return mapper.writeValueAsString(object);
} catch (Exception e) {
throw new RuntimeException("Could not convert Object to JSON.", e);
}
}
public static <T> T convertToObject(String json, Class<T> clazz) {
ObjectMapper mapper = new ObjectMapper();
try {
return mapper.readValue(json, clazz);
} catch (Exception e) {
throw new RuntimeException("Could not convert JSON to Object.", e);
}
}
我必须建议你以更好的方式捕捉你的例外情况。如果您的应用程序抛出错误,您必须抛出该错误而不是忽略它。使用throw new RuntimeException("Could not convert JSON to <whatever>", e);
<强>更新强>
不要忘记在课堂上声明getter / setter。
答案 1 :(得分:0)
我认为你必须使用java bean来序列化你的Object。 http://en.wikipedia.org/wiki/JavaBeans。
事实上,
该类必须具有公共默认构造函数(不带参数)。这样可以在编辑和激活框架中轻松实例化。
根据标准命名约定,必须使用get,set,is(用于布尔属性而不是get)以及其他方法(所谓的访问器方法和mutator方法)来访问类属性。这允许在框架内轻松自动检查和更新bean状态,其中许多包括用于各种类型属性的自定义编辑器。 Setter可以有一个或多个参数。
该类应该是可序列化的。 [这允许应用程序和框架以独立于VM和平台的方式可靠地保存,存储和恢复bean的状态。]
因此,您的班级UpdateBroadcastMessageData
必须符合这些标准。