0

我想使用通用模型通过 websocket 从服务器到客户端广播不同的数据。不幸的是,我在想要序列化以下类结构时总是遇到错误:

使用 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

提前致谢。法科

4

2 回答 2

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。

于 2013-05-28T07:44:13.533 回答
0

我认为您必须使用 java bean 来序列化您的对象。http://en.wikipedia.org/wiki/JavaBeans

实际上,

该类必须有一个公共的默认构造函数(没有参数)。这允许在编辑和激活框架内轻松实例化。

根据标准命名约定,必须使用 get、set、is(用于布尔属性而不是 get)和其他方法(所谓的访问器方法和修改器方法)来访问类属性。这允许在框架内轻松自动检查和更新 bean 状态,其中许多框架包括用于各种类型属性的自定义编辑器。Setter 可以有一个或多个参数。

该类应该是可序列化的。[这允许应用程序和框架以独立于 VM 和平台的方式可靠地保存、存储和恢复 bean 的状态。]

因此,您的班级UpdateBroadcastMessageData必须符合这些标准。

于 2013-05-28T08:49:24.650 回答