java之序列化
© 版权声明:本文为博主原创文章,转载请注明出处
序列化
1. 必须实现Serializable接口,该接口是一个空实现,只是一个规定
2. transient修饰的元素不会再进行JVM默认的序列化,但是可以自己进行序列化
3. transient修饰的元素可能不用序列化,也可能是自己实现序列化提高效率。
4. 若父类实现了Serializable接口,其子类进行序列化时,不会显示调用父类的构造方法;
若父类未实现Serializable接口,其子类进行序列化时,会显示调用父类的构造方法。
ArrayList中使用transien实例
1. 打开ArrayList源码可发现elementData元素即是使用transient进行修饰

2. 查看ArrayList实现序列化的方法,可看见elementData依然进行序列化了,只不过是只序列化有效数据,无效数据不进行序列化,提高效率

实例:
1.项目结构

2.Student.java
package org.java.base.serializable;
import java.io.Serializable;
/**
* 学生类
*/
public class Student implements Serializable {
private String stuName;
private String stuSex;
private transient int stuAge;// 该元素不会进行JVM默认的序列化,但可自己进行序列化
public Student(String stuName, String stuSex, int stuAge) {
this.stuName = stuName;
this.stuSex = stuSex;
this.stuAge = stuAge;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public String getStuSex() {
return stuSex;
}
public void setStuSex(String stuSex) {
this.stuSex = stuSex;
}
public int getStuAge() {
return stuAge;
}
public void setStuAge(int stuAge) {
this.stuAge = stuAge;
}
@Override
public String toString() {
return "Student{" +
"stuName='" + stuName + '\'' +
", stuSex='" + stuSex + '\'' +
", stuAge=" + stuAge +
'}';
}
/**
* 自定义进行序列化
*
* @param s
*
* @throws java.io.IOException
*/
private void writeObject(java.io.ObjectOutputStream s)
throws java.io.IOException {
s.defaultWriteObject();// 把JVM能默认序列化的元素进行序列化操作
s.writeInt(stuAge + 1);// 自己完成stuAge的序列化
}
/**
* 自定义进行反序列化
*
* @param s
*
* @throws java.io.IOException
*
* @throws ClassNotFoundException
*/
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
s.defaultReadObject();// 把JVM能默认反序列化的元素进行反序列化操作
this.stuAge = s.readInt();// 自己完成stuAge的反序列化
}
}
3.StuSerializable.java
package org.java.base.serializable;
import java.io.*;
/**
* 序列化与反序列化
*/
public class StuSerializable {
public static void main(String[] args) throws Exception {
StuSerializable ss = new StuSerializable();
ss.createSerializeFile("demo\\obj.dat");
ss.stuDeserialize("demo\\obj.dat");
}
/**
* 序列化,并保存到文件中
*
* @param fileName
* 文件名
* @throws IOException
*/
private void createSerializeFile(String fileName) throws IOException {
ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream(fileName));
Student stu = new Student("张三", "男", 25);
oos.writeObject(stu);
oos.close();
}
/**
* 反序列化
*
* @param fileName
* 文件名
* @throws Exception
*/
private void stuDeserialize(String fileName) throws Exception {
ObjectInputStream ois = new ObjectInputStream(
new FileInputStream(fileName));
Student stu = (Student) ois.readObject();
System.out.println(stu);
}
}
4. 效果预览

© 版权声明:本文为博主原创文章,转载请注明出处

浙公网安备 33010602011771号