不可序列化第三方类的Java序列化

不可序列化第三方类的Java序列化,java,serialization,io,jaxb,object-serialization,Java,Serialization,Io,Jaxb,Object Serialization,我目前正在开发一个web应用程序,我希望将java对象持久化到服务器上,以便随时检索它们。因为数据库对我的应用程序来说是一种过度的杀伤力,所以我选择了最简单的持久化java对象的方法:序列化为xml或字节。不幸的是,我使用的大部分代码都是我无法修改的java类,这些类没有实现接口“可序列化”。关于序列化这些类的对象以及我自己的类的其他交互对象,我有哪些选择 我认为JSON将是这里的解决方案。以图书馆为例。您不需要注释类,只需编写 Gson gson = new Gson(); MyObj obj

我目前正在开发一个web应用程序,我希望将java对象持久化到服务器上,以便随时检索它们。因为数据库对我的应用程序来说是一种过度的杀伤力,所以我选择了最简单的持久化java对象的方法:序列化为xml或字节。不幸的是,我使用的大部分代码都是我无法修改的java类,这些类没有实现接口“可序列化”。关于序列化这些类的对象以及我自己的类的其他交互对象,我有哪些选择

我认为JSON将是这里的解决方案。以图书馆为例。您不需要注释类,只需编写

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

有关JSON格式的更多一般信息,请参阅

一个选项是扩展您无权访问的类,以保存它们的内部状态,并在这些类上实现可序列化

有关此问题的更多信息:


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

正如我在评论中所说的,我会选择
序列化服务
,它会为您想要保存的每个对象找到合适的
序列化程序

比如:

public interface Serializer<T> {

Serializable toSerializable(T objectToSerialize);

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

T fromSerializable(Serializable serializedObject);
公共接口序列化程序{
可序列化到可序列化(T objectToSerialize);
//围绕它建立工厂/服务
布尔canDeserialize(可序列化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;
}
公共类PathSerializer实现序列化程序{
@凌驾
公共可序列化到可序列化(路径对象序列化){
返回objectToSerialize.toString();
}
@凌驾
来自Serializable的公共路径(Serializable serializedObject){
如果(!canDeserialize(序列化对象)){
抛出新的IllegalArgumentException(“无法反序列化此”);
}
返回路径。get((字符串)serializedObject);
}
@凌驾
公共布尔值canDeserialize(可序列化serializedObject){
返回serializedObject!=字符串的null&&serializedObject实例;
}
}

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


这一切都取决于您和应用程序的复杂性。

如果您可以对它们进行子类化,并在子类中实现Serializable,您就可以开始了。另一种方法是实现一种自定义的方法来自己序列化它们。你的问题太宽泛了,这里无法回答。但作为一个简短的例子:如果路径总是由同一台机器反序列化,则可以将其序列化为字符串。还请理解,java.io.Stream之类的类根本无法序列化。你必须找到一种方法让你的代码从其他东西中重新创建一个流。我认为在我的例子中,解决方案是通过提供我自己的可序列化接口的writeObject和readObject方法实现一种自定义方式来序列化对象。您建议如何包装原始的第三方类?通过扩展这个类或创建一个引用第三方类的对象的新类,我会选择一个接口
序列化器
,它将提供两种方法:a
Serializable-toSerializable(T objectToSerialize)
和a
T fromSerializable(Serializable-serializedObject)
为每个需要序列化的类提供唯一的可序列化类。然后将所有序列化程序包装在SerializationService/Factory中,该序列化服务/工厂可以找到往返的路径。因此,在不可序列化的类和序列化文件之间只有一个中间层(DAO)?谢谢