Java序列化
一、序列化和反序列化
- 序列化:指堆内存中的java对象数据,通过某种方式把对存储到磁盘文件中,或者传递给其他网络节点(网络传输)。这个过程称为序列化,通常是指将数据结构或对象转化成二进制的过程。
- 反序列化:把磁盘文件中的对象数据或者把网络节点上的对象数据,恢复成Java对象模型的过程。也就是将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程。
二、实现对象序列化
public class Student implements Serializable{
private static final long serialVersionUID = 3547145316233835846L;
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
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;
}
public static long getSerialversionuid() {
return serialVersionUID;
}
}
public static void main(String[] args) {
Student student = new Student("张三", 18);
// 对象序列化
try {
ObjectOutputStream oos = null;
FileOutputStream fos = null;
fos = new FileOutputStream("D:\\1.txt");
oos = new ObjectOutputStream(fos);
oos.writeObject(student);
fos.close();
oos.close();
} catch (Exception e) {
e.printStackTrace();
}
//反序列化
Student student1 = null;
try {
ObjectInputStream ois = null;
FileInputStream fis = null;
fis = new FileInputStream("D:\\1.txt");
ois = new ObjectInputStream(fis);
Object object = ois.readObject();
student1 = (Student) object;
fis.close();
ois.close();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(student1.getName()+"今年"+student1.getAge());
}
三、对象序列化实现步骤
- 对象类实现Serializable接口
- 生成序列号private static final long serialVersionUID = 3547145316233835846L;
- 使用IO流中的对象流可以实现序列化操作,将对象保存到文件,再读取出来。
四、序列化ID的作用
这个序列化ID起着关键的作用,它决定着是否能够成功反序列化!java的序列化机制是通过判断运行时类的serialVersionUID来验证版本一致性的,在进行反序列化时,JVM会把传进来的字节流中的serialVersionUID与本地实体类中的serialVersionUID进行比较,如果相同则认为是一致的,便可以进行反序列化,否则就会报序列化版本不一致的异常。
五、序列化的其他问题
- 静态变量不会被序列化( static,transient)
- 当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口。
- 当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化。
六、排序比较
- 专门为对象创建一个比较器,一般用匿名内部类来创建
public class Student{
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
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;
}
}
public static void main(String[] args) {
Student student_1 = new Student("张三", 18);
Student student_2 = new Student("李四", 18);
List<Student> list=new ArrayList<Student>();
list.add(student_1);
list.add(student_2);
Collections.sort(list,new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
int retu=0;
if(o1.getAge()<o2.getAge()) {
retu=1;
}else if(o1.getAge()>o2.getAge()) {
retu=-1;
}else {
char name_1=o1.getName().charAt(0);
char name_2=o2.getName().charAt(0);
if(name_1<name_2) {
retu=1;
}else {
retu=-1;
}
}
return retu;
}
});
for (Student student : list) {
System.out.println(student.getName()+":"+student.getAge());
}
}
- 排序对象中实现Comparable接口 通过重写其compareTo方法
public class Student implements Comparable<Student>{
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
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;
}
@Override
public int compareTo(Student o) {
int age_1=this.age;
int age_2=o.age;
int retu=0;
if(age_1<age_2) {
retu=1;
}else {
retu=-1;
}
return retu;
}
}
public static void main(String[] args) {
Student student_1 = new Student("张三", 18);
Student student_2 = new Student("张三", 35);
List<Student> list=new ArrayList<Student>();
list.add(student_1);
list.add(student_2);
Collections.sort(list);
for (Student student : list) {
System.out.println(student.getName()+":"+student.getAge());
}
}