1

我有一张地图:

Map<String, DistributorAdd> map= new TreeMap<String, DistributorAdd>();

我将它保存在 file.txt

FileOutputStream  fos = new FileOutputStream("Distrib.txt");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(map);
        oos.close();

问题是昨天的分销商喜欢:

public DistributorAdd(String distributor, String 
        emailAdress, String name, String speciality){...}

明天会是这样:

public void ajouter(String Distributor, String EmailAdress, 
    String Name, String Phone, String Image) {..}

我的同事已经在她的 Distrib.txt 中放置了很多信息,所以我想要的是能够在 Map 中放置一个新字符串而不破坏它。

我想保留 Distrib.txt 和我的 DistributorAdd 函数,有什么简单的步骤可以做到吗?

我得到的错误是:

ObjectInputStream ois = new ObjectInputStream(new FileInputStream("Distrib.txt"));
VendorA = (DistributorAdd) ois.readObject();

错误:

IOException : table.java => table()java.io.StreamCorruptedException: invalid stream header: ACED0573
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:780)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:277)
at car.Table.<init>(Table.java:185)
at car.Table.main(Table.java:837)

如果您有任何问题或需要我提供的更多信息,我将很乐意提供。

4

1 回答 1

0

请注意以下有关序列化的事项:

1)必须非常明智地使用它。

2)当我们序列化一个类时,就好像我们正在以实例变量的形式导出它的API。

3)始终SerialVersionUID在您的可序列化类中显式声明,如果我们不这样做,JVM 将根据您的类的内部结构(实例变量、公共方法等)自动计算,因此更改类的内部结构会改变这一点SerialVersionUID

因此,如果我们在一个版本中对一个类进行序列化,然后在另一个版本中对其进行反序列化(通过版本更改,我的意思是我们正在更改可序列化对象的某些内部结构),版本不兼容必然会发生。

我不确定究竟是什么导致您的代码失败,因为我不知道您在 Serializable 类中做了哪些更改。

但我认为你应该考虑第 3 点

于 2013-04-12T08:34:13.010 回答