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 缩小了代码,为字段提供了新的缩写名称,例如
a
、b
、c
等
序列化时,字段名称会存储到流中。读取流时,名称必须匹配。
当我上次压缩代码时(对于应用程序的新生产版本),ProGuard 为字段提供了不同的名称(在我的例子中是
是由于更改了 ProGuard 设置,但可能是由于其他原因
原因也一样,不确定 ProGuard 是否保证每个名称都相同
时间)。
结果,我在新版本中反序列化对象时,由于名称不匹配,所有字段都设置为默认值。
【讨论】:
以上是关于ObjectInputStream 读取一个空对象的主要内容,如果未能解决你的问题,请参考以下文章
java使用ObjectInputStream从文件中读取对象
ObjectInputStream - 读取对象 - 有没有办法阻止调用无参数超类构造函数?
使用ObjectInputStream的readObject()方法如何判断读取到多个对象的结尾