将值添加到treeMap的函数中,而不会丢失旧数据

时间:2013-04-12 07:56:43

标签: java map save ioexception treemap

我有一张地图:

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中放了很多信息,所以我想要的是能够在地图中放置一个新的String而不会破坏它。

我想保留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)

如果您有任何疑问或需要提供更多信息,我将乐意为您服务。

1 个答案:

答案 0 :(得分:0)

请注意关于序列化的一些事项:

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

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

3)如果我们的话,总是在您的可序列化类中明确声明SerialVersionUID 不会由JVM根据您班级的内部结构自动计算 (实例变量,公共方法等)因此改变了类的内部结构 chnages this SerialVersionUID

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

由于我不知道,我不确定您的代码究竟是什么原因造成的 你在Serializable类中做了什么chnages。

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