前面的例子我们反复的将同一个数组写出到文件中,但是并没有修改数组的内容。下面的例子我们将每次写出内容不同的数组。因为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的数组,以后每次都根据读取到的指针反复在本地哈希表中读取了。也就是说序列化机制只关心对象是否变化,而不关心内容是否变化。
通过这些提点,我们可以看出序列化的原则是:如果需要重复序列化一个对象,并且两次序列化之间对象的内容会发生改变,那么就要复位输出流。或者每次输出前都重新创建一个对象。