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. 效果预览
© 版权声明:本文为博主原创文章,转载请注明出处