ObjectInputStream 读取一个空对象

Posted

技术标签:

【中文标题】ObjectInputStream 读取一个空对象【英文标题】:ObjectInputStream read a empty object 【发布时间】: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 应用程序版本,但是当用户更新到应用程序的下一个版本时会出现问题。存储在内部存储中的文件无法正常读取。 【参考方案1】:

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

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

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

【讨论】:

以上是关于ObjectInputStream 读取一个空对象的主要内容,如果未能解决你的问题,请参考以下文章

java使用ObjectInputStream从文件中读取对象

对象反序列化流ObjectInputStream

ObjectInputStream - 读取对象 - 有没有办法阻止调用无参数超类构造函数?

使用ObjectInputStream的readObject()方法如何判断读取到多个对象的结尾

Android:读取arraylist时ObjectInputStream抛出ClassCastException

使用 LocalDate 字段读取对象时自定义 ObjectInputStream 的意外行为