import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;public class ArrayListTest { public static ArrayList<String> al = new ArrayList<String>(); public static void main(String[] args) {
File f = new File("D:\\test.txt");
FileInputStream fis = null;
FileOutputStream fos = null;
ObjectInputStream ois = null;
ObjectOutputStream oos = null;
InfoTest info = null;
try {
fis = new FileInputStream(f);
fos = new FileOutputStream(f);
oos = new ObjectOutputStream(fos);
ois = new ObjectInputStream(fis);
al.add("AAAAAA");
oos.writeObject(al);
String s = (String) ((ArrayList<String>) ois.readObject()).get(0);
System.out.println(s);//可以正确的得到AAAAAA al.add("BBBBBB");
oos.writeObject(al);
System.out.println(al.size());//打印2
ArrayList<String> all = (ArrayList<String>) ois.readObject();
System.out.println(all.size());//为什么是1呢,序列化的时候,al里面是有2个元素啊!
System.out.println(all.get(0));
//System.out.println(all.get(1)); } catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
try {
oos.close();
fos.close();
ois.close();
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } }
}

解决方案 »

  1.   

    因为Java序列化机制为了节省磁盘空间,具有特定的存储规则,当写入文件的为同一对象时(根据包名+类名),并不会再将对象的内容进行存储,而只是再次存储一份引用。
    改下代码,就能发系列化出AAAA和BBBBpackage test;import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.util.ArrayList;public class ArrayListTest { public static ArrayList<String> al = new ArrayList<String>(); public static void main(String[] args) {
    File f = new File("D:\\test.txt");
    FileInputStream fis = null;
    FileOutputStream fos = null;
    ObjectInputStream ois = null;
    ObjectOutputStream oos = null;
    InfoTest info = null;
    try {
    fis = new FileInputStream(f);
    fos = new FileOutputStream(f);
    oos = new ObjectOutputStream(fos);
    ois = new ObjectInputStream(fis);
    al.add("AAAAAA");
    // 注释部分
    //oos.writeObject(al);
    //String s = (String) ((ArrayList<String>) ois.readObject()).get(0);
    //System.out.println(s);// 可以正确的得到AAAAAA al.add("BBBBBB");
    oos.writeObject(al);
    System.out.println(al.size());// 打印2
    ArrayList<String> all = (ArrayList<String>) ois.readObject();
    System.out.println(all.size());// 为什么是1呢,序列化的时候,al里面是有2个元素啊!
    System.out.println(all.get(0));
    // 打开注释
    System.out.println(all.get(1)); } catch (FileNotFoundException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    } finally {
    try {
    oos.close();
    fos.close();
    ois.close();
    fis.close();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } } }
    }广告我的一篇文章:Java Serializable系列化与反系列化
      

  2.   

    谢谢咯!还有认真看了你的 Java Serializable系列化与反系列化 感觉写得很好!