【问题标题】:Add a value to a function of treeMap without losing old data在不丢失旧数据的情况下向treeMap的函数添加值
【发布时间】:2023-03-21 21:49:01
【问题描述】:

我有一张地图:

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)

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

【问题讨论】:

  • 你是说DistributorAdd类被序列化后改变了?
  • 是的:公共类 DistributorAdd 实现 Serializable {..} 我没有考虑可序列化我去看看谢谢。

标签: java map save ioexception treemap


【解决方案1】:

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

1) 必须非常谨慎地使用它。

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

3) 始终在您的可序列化类中明确声明 SerialVersionUID,如果我们 难道不是JVM会根据你的类的内部结构自动计算出来的吗 (实例变量,公共方法等)所以改变类的内部结构 更改此SerialVersionUID

因此,如果我们在一个版本中序列化一个类,然后在另一个版本中反序列化它 (通过版本更改,我的意思是我们正在更改一些可序列化的内部结构 object) , 版本不兼容是必然的。

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

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

【讨论】:

  • 感谢您的帮助,我现在更好地理解了它为什么不起作用,并会在再次使用之前尝试更好地理解序列化。一个有趣的链接:link
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-23
  • 2017-04-07
相关资源
最近更新 更多