有趣的Java对象序列化缓存问题

发表于:2010-5-17 13:00

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:51Testing软件测试网采编

分享:

  前面的例子我们反复的将同一个数组写出到文件中,但是并没有修改数组的内容。下面的例子我们将每次写出内容不同的数组。因为Arrays.fill()的执行效率比较低。所以我们只写出256个大数组。

47.import java.io.*;
48.import java.util.Arrays;
49.
50.public class ModifiedObjectWriter {
51.    public static void main(String[] args) throws IOException {
52.        byte[] data = new byte[10 * 1024 * 1024];
53.        ObjectOutputStream out = new ObjectOutputStream(
54.            new BufferedOutputStream(
55.                new FileOutputStream("smalldata.bin")
56.            )
57.        );
58.        for (int i = -128; i < 128; i++) {
59.            Arrays.fill(data, (byte) i);
60.            out.writeObject(data);
61.        }
62.        out.writeObject(null);
63.        out.close();
64.    }
65.}

  接下来,我们把写出的内容在从文件中读出看看。

66.import java.io.*;
67.
68.public class ModifiedObjectReader {
69.    public static void main(String[] args) throws Exception {
70.        ObjectInputStream in = new ObjectInputStream(
71.            new BufferedInputStream(
72.                new FileInputStream("smalldata.bin")
73.            )
74.        );
75.        byte[] data;
76.        while ((data = (byte[]) in.readObject()) != null) {
77.        System.out.println(data[0]);
78.        }
79.        in.close();
80.    }
81.}

  观察会发现,读出的内容并没有-128, -127, -126等数字,只有-128。这是因为虽然每次我们写出之前都修改了数据的内容,但是依然是原来的数组。Java序列化机制除了第一次写出数组内容以外,以后每次只写出一个指针。在读的时候,也就只第一次读取到内容为-128的数组,以后每次都根据读取到的指针反复在本地哈希表中读取了。也就是说序列化机制只关心对象是否变化,而不关心内容是否变化。

  通过这些提点,我们可以看出序列化的原则是:如果需要重复序列化一个对象,并且两次序列化之间对象的内容会发生改变,那么就要复位输出流。或者每次输出前都重新创建一个对象。

32/3<123>
100家互联网大公司java笔试题汇总,填问卷领取~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2023
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号