当类发生更改时,从文件加载序列化类(Java/Android)

当类发生更改时,从文件加载序列化类(Java/Android),java,android,Java,Android,我已经找到了很多关于如何将序列化类写入/读取到文件的答案,并成功地将其实现到我的Android应用程序中,但是我遇到了扩展应用程序功能的问题 例如,如果我有carClass: String make; String model; 然后我将其保存到我的保存文件中,每当我加载它时,存储的值都正常:) 但当我尝试扩展类以包含其他内容,即颜色时: String make; String model; String color; 当应用程序加载文件时,它尝试将对象强制转换到新类中,由于加载的对象没有“

我已经找到了很多关于如何将序列化类写入/读取到文件的答案,并成功地将其实现到我的Android应用程序中,但是我遇到了扩展应用程序功能的问题

例如,如果我有carClass:

String make;
String model;
然后我将其保存到我的保存文件中,每当我加载它时,存储的值都正常:)

但当我尝试扩展类以包含其他内容,即颜色时:

String make;
String model;
String color;
当应用程序加载文件时,它尝试将对象强制转换到新类中,由于加载的对象没有“颜色”,因此无法加载保存文件


我如何克服这个问题?目前,每次我向我的应用程序添加新内容时,用户的保存文件实际上是无效的,它们必须重新启动,这不是一个好的用户体验

在类中声明一个
静态最终长SerialVersionId
。这将使其向前/向后兼容,例如

String make;
String model;
private static final long serialVersionUID = 0L;
兼容

String make;
String model;
String color;
private static final long serialVersionUID = 0L;

只要保持
serialVersionUID
的值不变。android文档,普通Java文档。

创建一个包含所有属性的新类。加载所有旧对象,然后从该数据创建新类的实例。@Pphoenix仅声明
serialVersionUID
,不是更容易吗?请参阅@bcsb1001您仍然可以读取具有旧类定义的文件吗?我非常确定ObjectInputStream不会读取该文件。新变量得到什么值?@Pphoenix它们得到默认值(与默认构造函数中给出的值相同),是的,您仍然可以读取它,看,今晚我将尝试这个!关于您的答案,最好的一点是不需要进行重大重构:)谢谢!!!!还有一个简单的问题,您说过要保持serialVersionUID不变,但是在文档中它说‘如果您声明了serialVersionUID,那么每次您的类与以前的版本发生不兼容的更改时,您都应该增加它。通常,这是在添加、更改或删除非瞬态字段时发生的。那么我应该增加吗?如果是,如何增加?L是否一直保持不变,我只是增加数字?e、 g.0L,1L,2L,3L?@killzusall我相信你所做的不是不兼容的,因此不需要递增(将在一秒钟内测试),但如果你必须递增,就按你说的那样做0L,1L,等等。所有的
L
意味着它是一个
long
值,而不是
int
的默认值。刚刚测试过,增加
serialVersionUID
将使在没有
InvalidClassException
的情况下无法读取类的以前的表单。所以,保持
serialVersionUID
不变,除非您想使该类以前的所有形式无效。昨晚尝试过,效果非常好!再次感谢bcsb1001