Java 不可序列化第三方的序列化 class
Java serialization of non serializable third party class
我目前正在开发一个 Web 应用程序,我想让 java 对象在服务器上持久化,以便可以随时检索它们。由于数据库对我的应用程序来说是一种过大的杀伤力,我选择了最简单的持久化 java 对象的方法:序列化到 xml 或字节。不幸的是,我使用的大部分代码是 java 类,我无法修改这些代码 类 没有实现接口 'serializable'。关于序列化这些 类 的对象以及我自己的 类 的其他交互对象,我有哪些选择?
我认为 JSON 是这里的首选解决方案。以Googles GSON库为例。您不需要注释 类,只需写
Gson gson = new Gson();
MyObj obj = gson.fromJson(jsonString);
String json = gson.toJson(obj);
有关 JSON 格式的更多一般信息,请参阅 official JSON documentation。
一种选择是扩展您无权访问的 类,以保存其内部状态,并在其上实现可序列化。
关于这个 SO 问题的更多信息:
Serializing a class variable which does not implement serializable
除此之外,我认为除了构建一些包装器并手动将 类 序列化为 XML 或 JSON.
之外,没有其他选择。
正如我在评论中所说,我会选择 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 class 及其构造函数中所需的参数列表 an/or 其字段的映射,以便能够通过以下方式重新生成对象反射。
这完全取决于您和您的应用程序的复杂程度。
我目前正在开发一个 Web 应用程序,我想让 java 对象在服务器上持久化,以便可以随时检索它们。由于数据库对我的应用程序来说是一种过大的杀伤力,我选择了最简单的持久化 java 对象的方法:序列化到 xml 或字节。不幸的是,我使用的大部分代码是 java 类,我无法修改这些代码 类 没有实现接口 'serializable'。关于序列化这些 类 的对象以及我自己的 类 的其他交互对象,我有哪些选择?
我认为 JSON 是这里的首选解决方案。以Googles GSON库为例。您不需要注释 类,只需写
Gson gson = new Gson();
MyObj obj = gson.fromJson(jsonString);
String json = gson.toJson(obj);
有关 JSON 格式的更多一般信息,请参阅 official JSON documentation。
一种选择是扩展您无权访问的 类,以保存其内部状态,并在其上实现可序列化。
关于这个 SO 问题的更多信息: Serializing a class variable which does not implement serializable
除此之外,我认为除了构建一些包装器并手动将 类 序列化为 XML 或 JSON.
之外,没有其他选择。正如我在评论中所说,我会选择 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 class 及其构造函数中所需的参数列表 an/or 其字段的映射,以便能够通过以下方式重新生成对象反射。
这完全取决于您和您的应用程序的复杂程度。