ObjectInputStream读取一个空对象

时间:2013-10-30 06:05:17

标签: java objectinputstream objectoutputstream

我使用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;
   }

  }

1 个答案:

答案 0 :(得分:0)

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

在我的情况下,问题是由于使用 ProGuard

  1. ProGuard缩小了代码,为字段提供了新的短名称,例如 abc
  2. 序列化时,字段名称将存储到流中。读取流时,名称必须匹配。
  3. 当我最后一次缩小代码时(对于应用程序的新生产版本),ProGuard为字段指定了不同的名称(在我的例子中) 是由于更改了ProGuard设置,但可能是由于其他原因 原因也是如此,不确定ProGuard是否保证每个人都使用相同的名称 时间)。
  4. 结果,当我在新版本中反序列化对象时,由于名称不匹配,所有字段都设置为默认值。