package test01;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
public class ClassCopy {
public static void main(String[] args) {
List<Student> list = new ArrayList<Student>();
list.add(new Student("1",1));
list.add(new Student("2",2));
list.add(new Student("3",3));
list.add(new Student("4",4));
list.add(new Student("5",5));
List<Student> copyList = new ArrayList<Student>();
try {
copyList = CopyListBySerialize(list);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
list.remove(2);
System.out.println(list.size());
System.out.println(copyList.size());
}
public static List CopyListBySerialize(List list) throws IOException, ClassNotFoundException{
//字节数组输出流在内存中创建一个字节数组缓冲区,所有发送到输出流的数据都保存在该字节数组缓冲区;
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
//创建一个对象输出流对象(对字节数组输出流对象的一个包装)
/*
* 为什么需要包装流:目的是为了增强流的功能,如OutputStream,只负责输出字节,字节数组,关闭等简单的原始字节操作。
* 为了使其在输出过程中具备更多的功能,如可以输出数字,布尔值,整数,小数,对象,UTF字符串等,
* 则可以使用ObjectOutputStream,DataOutputStream完成各种数据的输出转换,
* 并且将转换后的数据传递给被包装得原始OutputStream流,如FileOutputStream
*/
ObjectOutputStream out = new ObjectOutputStream(byteOut);
//把集合写入对象流中
out.writeObject(list);
//创建一个字节数组输入流对象,数据为之前输出流的数据
ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
//创建一个对象输入流对象(对字节数组输入流对象的一个包装)
ObjectInputStream in = new ObjectInputStream(byteIn);
//获取输出流中的对象
List copyList = (List) in.readObject();
return copyList;
}
}
class Student implements Serializable{
private String name;
private int age;
public Student() {
super();
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
如实体类Student没有实现Seralizable接口的话,则会出现如下报错:
java.io.NotSerializableException: test01.Student。
正确输出为:
4
5