Java反序列化如何忽略属性
我有一个序列化到文件中的对象列表:Java反序列化如何忽略属性,java,serialization,deserialization,Java,Serialization,Deserialization,我有一个序列化到文件中的对象列表: class MyClass implements Serializable { public String location; public SomeClass lastUpdatedAt; } 不幸的是,我现在有了这个类的一个新版本,我们不再有SomeClass了;原因很复杂,但我需要将其序列化回这种新形式(这是一个示例类,显然不是实际的类): 简而言之,我想在反序列化时忽略一个属性 请注意,我无法更改原始类源文件。我只有新的源文件 但
class MyClass implements Serializable {
public String location;
public SomeClass lastUpdatedAt;
}
不幸的是,我现在有了这个类的一个新版本,我们不再有SomeClass了;原因很复杂,但我需要将其序列化回这种新形式(这是一个示例类,显然不是实际的类):
简而言之,我想在反序列化时忽略一个属性
请注意,我无法更改原始类源文件。我只有新的源文件
但是,ObjectInputStream尝试在类路径上查找SomeClass时失败:
try {
FileInputStream fis;
ObjectInputStream is;
File f = getSavedFile();
if (f.exists()) {
fis = new FileInputStream(f);
is = new ObjectInputStream(fis);
ArrayList<MyClass> result = (ArrayList<MyClass>) is.readObject(); //fails
is.close();
fis.close();
}
}
catch (Exception e) {
//ClassNotFound exception because SomeClass is not on the classpath.
e.printStackTrace();
}
试试看{
文件输入流fis;
目的输入流是;
文件f=getSavedFile();
如果(f.exists()){
fis=新文件输入流(f);
is=新的ObjectInputStream(fis);
ArrayList结果=(ArrayList)为.readObject();//失败
is.close();
fis.close();
}
}
捕获(例外e){
//ClassNotFound异常,因为某个类不在类路径上。
e、 printStackTrace();
}
我知道您可以扩展ObjectInputStream并在那里实现一些东西,但我对序列化不太熟悉,希望有人能解决同样的问题。将其暂时化会将其从序列化中排除
public transient SomeClass lastUpdatedAt;
据
变量可以标记为瞬态,以表明它们不是一部分
对象的持久状态
使其成为瞬态将从序列化中排除它
public transient SomeClass lastUpdatedAt;
据
变量可以标记为瞬态,以表明它们不是一部分
对象的持久状态
也许你已经成功了。如果不起作用,则必须重写该方法
出于这个原因,我不喜欢自动序列化,而是手动执行:实现要序列化的字段以及如何序列化
每次更新代码时,如果使用内置函数,则向后兼容性也会出现同样的问题
ArrayList<MyClass> result = (ArrayList<MyClass>) is.readObject(); //fails
也许你已经成功了。如果不起作用,则必须重写该方法
出于这个原因,我不喜欢自动序列化,而是手动执行:实现要序列化的字段以及如何序列化
每次更新代码时,如果使用内置函数,则向后兼容性也会出现同样的问题
ArrayList<MyClass> result = (ArrayList<MyClass>) is.readObject(); //fails
将破坏反序列化
您可以尝试重写equals()
和hashCode()
方法,使MyClassNew看起来像MyClass
您可以了解更多如何覆盖所需的方法。这应该给你一个解决办法
private void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException {
location = (String) stream.readObject();
}
将破坏反序列化
您可以尝试重写equals()
和hashCode()
方法,使MyClassNew看起来像MyClass
您可以了解更多如何覆盖所需的方法。这应该给你一个解决办法
private void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException {
location = (String) stream.readObject();
}
这是可行的,但有一点很重要(我会编辑我的问题)我忘了:我不能更改原始类源。这是可行的,但有一点很重要(我会编辑我的问题)我忘了:我不能更改原始类源。问题同上。我无法对原始来源进行任何更改。这是一个正在运行的服务,我需要用一个全新的服务进行更新,同时还要将遗留数据序列化到文件中。。。。简言之,与上述问题相同。我无法对原始来源进行任何更改。这是一个正在运行的服务,我需要用一个全新的服务进行更新,同时还要将遗留数据序列化到文件中。。。。简而言之,这给了我一个错误:java.io.StreamCorruptedException:格式错误:0另外,我在两个类中都有相同的serialVersionUID,位于least@breakline这也是需要的,忘了提一下,但是Eclipse它通常会生成这给了我一个错误:java.io.StreamCorruptedException:错误的格式:0,我在两个类中都有相同的serialVersionUID,在least@breakline这也是需要的,忘了提一下,但它通常会生成Eclipse