Java ObjectInputStream读取空对象

Java ObjectInputStream读取空对象,java,objectinputstream,objectoutputstream,Java,Objectinputstream,Objectoutputstream,我使用ObjectOutputStream编写了一个对象,并使用ObjectInputStream读取它,然后对它进行了测试,得到了预期的结果。但当在其他机器上写入对象,在我的计算机上读取时,读取对象的成员是空的。有人能帮我吗?谢谢 public class TrustNet implements Serializable{ public double[][] trusts; public double avg = 0; public TrustNet(i

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

  }

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

在我的例子中,问题是由于使用了ProGuard

  • ProGuard缩小了代码,为字段指定了新的短名称,如
    a
    b
    c
  • 序列化时,字段的名称存储到流中。读取流时,名称必须匹配
  • 当我上次缩小代码时(对于应用程序的新生产版本),ProGuard给字段指定了不同的名称(在我的例子中是它) 是由于更改了ProGuard设置,但可能是由于其他原因 原因也是如此,不确定ProGuard是否保证每个月都使用相同的名称 时间)
  • 因此,在新版本中反序列化对象时,由于名称不匹配,所有字段都设置为默认值

  • 共享您迄今为止编写的代码
    读取对象的成员为空
    ,这是什么意思?它返回
    null
    ?@cstur4不在注释中发布代码。你可以自己看清楚它是难以辨认的。将其编辑到您的帖子中。请同时显示写入和读取代码,并说明如何传输文件。谢谢:)空对象表示其字段是默认值,而不是我保存的值。我只是在服务器上运行writeToFile函数,然后将文件复制到本地计算机上,然后运行readFromFile函数来获取TurstNet,但字段是默认值。当写和读都在本地机器上时,它就可以正常工作。我也有同样的问题。在所有字段中只使用默认值重试反序列化对象的原因可能是什么?在我的例子中,它适用于一个Android应用程序版本,但当用户更新到下一个版本的应用程序时,问题就会出现。存储在内部存储文件中的文件无法正常读取。