【问题标题】:ObjectInputStream read a empty objectObjectInputStream 读取一个空对象
【发布时间】:2013-11-09 14:21:12
【问题描述】:

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

  }

【问题讨论】:

  • 分享你写到现在的代码
  • the read object's members are empty,你是什么意思?它返回null?
  • @cstur4 不要在 cmets 中发布代码。你可以亲眼看到它难以辨认。将其编辑到您的帖子中。还请显示读写代码,并说明您是如何传输文件的。
  • 谢谢 :) 空对象意味着它的字段是默认值而不是我保存的值。我只是在服务器中运行 writeToFile 函数,然后将文件复制到我的本地计算机,我运行 readFromFile 函数来获取 TurstNet,但这些字段是默认值。当写入和读取都在我的本地机器上时,它就可以正常工作。
  • 我也有同样的问题。在所有字段中仅使用默认值返回反序列化对象的原因可能是什么?就我而言,它适用于一个 Android 应用程序版本,但是当用户更新到应用程序的下一个版本时会出现问题。存储在内部存储中的文件无法正常读取。

标签: java objectinputstream objectoutputstream


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2018-08-25
    • 2012-07-23
    • 2012-06-08
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    相关资源
    最近更新 更多