Java序列化非序列化第三方类

时间:2017-02-21 16:25:49

标签: java serialization io jaxb object-serialization

我目前正在开发一个Web应用程序,我想在服务器上保持java对象的持久性,以便随时检索它们。由于数据库对我的应用程序来说太过分了,我选择了最简单的持久化java对象的方法:序列化为xml或字节。不幸的是,我使用的代码的很大一部分是我无法修改的java类,这些类没有实现接口' serializable'。关于序列化这些类的对象以及我自己的类的其他交互对象,我有哪些选择?

3 个答案:

答案 0 :(得分:1)

正如我在评论中所说的那样,我会选择SerializationService,为每个要保存的对象找到合适的Serializer<T>

类似的东西:

public interface Serializer<T> {

Serializable toSerializable(T objectToSerialize);

//to build a factory/service around it
boolean canDeserialize(Serializable serializedObject);

T fromSerializable(Serializable serializedObject);

}

如果你想要一个基本的,具体的例子:使用相当常见的路径:

public class PathSerializer implements Serializer<Path> {

@Override
public Serializable toSerializable(Path objectToSerialize) {
    return objectToSerialize.toString();
}

@Override
public Path fromSerializable(Serializable serializedObject) {
    if(!canDeserialize(serializedObject)){
        throw new IllegalArgumentException("Cannot deserialize this");
    }
    return Paths.get((String)serializedObject);
}

@Override
public boolean canDeserialize(Serializable serializedObject) {
    return serializedObject != null && serializedObject instanceof String;
}

}

您还可以很好地存储包含原始对象类名称的POJO以及其构造函数所需的参数列表和/或其字段的映射,以便能够通过反射重新生成对象。

这完全取决于您和您的应用程序的复杂性。

答案 1 :(得分:0)

我认为JSON将成为这里的首选解决方案。以Googles GSON库为例。您不需要注释您的课程,只需写下

即可
Gson gson = new Gson();
MyObj obj = gson.fromJson(jsonString);
String json = gson.toJson(obj);

有关JSON格式的更多常规信息,请参阅official JSON documentation

答案 2 :(得分:0)

一种选择是扩展您无权访问的类,以便保存其内部状态,并在这些类上实现Serializable。

有关此SO问题的更多信息: Serializing a class variable which does not implement serializable

除此之外,我认为除了构建一些包装器并手动将类序列化为XML或JSON之外,还有其他选择。