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