2

我使用 ObjectOutputStream 编写了一个对象,并使用 ObjectInputStream 读取它,并对其进行了测试,我得到了预期的结果。但是当在其他机器上写入对象时,在我的计算机中读取它,读取对象的成员是空的。有人可以帮助我吗?谢谢

   public class TrustNet implements Serializable{

     public double[][] trusts;
     public double avg = 0;

     public TrustNet(int size){
        trusts = new double[size][size];
     }

    public void writeToFile(String fileName){
        try(ObjectOutputStream writer = new ObjectOutputStream(new  FileOutputStream(fileName))){
        writer.writeObject(this);
        writer.flush();
    } catch (IOException ex) {
        ex.printStackTrace();
    }
    }

   public static TrustNet readFromFile(String fileName){
    try(ObjectInputStream writer = new ObjectInputStream(new FileInputStream(fileName))){
        return (TrustNet) writer.readObject();
    } catch (IOException ex) {
        ex.printStackTrace();
    } catch (ClassNotFoundException ex) {
        ex.printStackTrace();
    }
    return null;
   }

  }
4

1 回答 1

0

我花了一天的时间才弄清楚发生了什么。我想我终于有了答案。可能会帮助其他有类似问题的人。

就我而言,问题是由于使用ProGuard造成的。

  1. ProGuard 缩小了代码,为字段提供了新的缩写名称,例如 a, b,c等。
  2. 序列化时,字段的名称被存储到流中。读取流时,名称必须匹配。
  3. 当我上次缩小代码时(对于应用程序的新生产版本),ProGuard 为字段提供了不同的名称(在我的情况下,这是由于更改了 ProGuard 设置,但也可能是由于其他原因,不确定 ProGuard 是否保证每次都用同一个名字)。
  4. 结果,当我在新版本中反序列化对象时,由于名称不匹配,所有字段都设置为默认值。
于 2018-05-21T20:14:01.020 回答