Java反序列化如何忽略属性

bre*_*ine 2 java serialization deserialization

我有一个序列化到文件中的对象列表:

class MyClass implements Serializable {

    public String location;
    public SomeClass lastUpdatedAt;

}
Run Code Online (Sandbox Code Playgroud)

不幸的是,我现在有了这个类的新版本,并且我们不再有 SomeClass 了;原因很复杂,但我需要将其序列化回新形式(这是一个示例类,显然不是实际的类):

class MyClass implements Serializable {

    public String location;

}
Run Code Online (Sandbox Code Playgroud)

简而言之,我想在反序列化时忽略一个属性。

请注意,我无法更改原始类源文件。我只有新的源文件

但是,当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();

    }
Run Code Online (Sandbox Code Playgroud)

我知道你可以扩展ObjectInputStream并在那里实现一些东西,但我对序列化不太熟悉,希望有人解决同样的问题。

mat*_*abi 5

class MyClass implements Serializable {

    public String location;
    public transient SomeClass lastUpdatedAt;

}
Run Code Online (Sandbox Code Playgroud)

也许你已经成功了。如果不起作用,那么您必须重写该方法。

因此,我不喜欢自动序列化,而是手动进行:实现要序列化的字段以及如何序列化。

如果您使用内置函数,每次更新代码时都会遇到相同的向后兼容性问题。