【问题标题】:Java serialization of non serializable third party class不可序列化的第三方类的Java序列化
【发布时间】:2023-04-07 00:49:01
【问题描述】:

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

【问题讨论】:

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

标签: java serialization io jaxb object-serialization


【解决方案1】:

正如我在 cmets 中所说,我会选择 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,其中包含您的原始对象类的名称以及其构造函数中所需的参数列表和/或其字段的映射,以便能够通过反射重新生成您的对象。

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 你能给我一个包装类的代码示例吗?谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-24
      • 1970-01-01
      • 2011-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多