三. 反序列化 ObjectInputStream
三.一 方法
三.一.一 构造方法
三.一.一.一 方法
三.一.一.二 演示
@Test public void readConTest() throws Exception{ File file=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc" +File.separator+"data2.txt"); ObjectInputStream objectInputStream=new ObjectInputStream(new FileInputStream(file)); }
三.一.二 读取方法
对于 ObjectInputStream 对象,只需要记住 readObject() 方法即可。
三.二 演示 ObjectInputStream
三.二.一 读取序列化的单个对象
@Test public void read1Test() throws Exception{ File file=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc" +File.separator+"data2.txt"); ObjectInputStream objectInputStream=new ObjectInputStream(new FileInputStream(file)); Object obj= objectInputStream.readObject(); //向上转型 Person person=(Person)obj; System.out.println("员工:"+person.toString()); objectInputStream.close(); }
运行程序,查看控制台打印输出:
三.二.二 读取序列化的对象集合
@Test public void read2Test() throws Exception{ File file=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc" +File.separator+"data3.txt"); ObjectInputStream objectInputStream=new ObjectInputStream(new FileInputStream(file)); Object readObj= objectInputStream.readObject(); //对象数组 Object[] objs=(Object[])readObj; for(Object obj:objs){ //对每一个进行强制转换。 Person person=(Person)obj; System.out.println("员工:"+person); } objectInputStream.close(); }
运行程序,查看控制台打印输出:
可以正确的读取。
四. 序列化部分属性 transient
有时候,一个实体类中属性过多,不需要全部保存起来,或者某个属性太重要,需要保证安全,不能存储起来, 那么就需要 使用 transient 关键字进行阻止序列化。
如 阻止序列化 name 和 sex
重新运行一下 write2Test() 和 read2Test() 方法,查看控制台
就发现, name 和 sex 没有被序列化。
五. Externalizable 接口实现序列化
除了 Serializable 接口可以实现序列化外,还可以使用 java.io.Externalizable 接口 进行序列化, 但常用的还是 Serializable 接口, 这个接口 Externalizable 只需要了解即可。
package java.io; import java.io.ObjectOutput; import java.io.ObjectInput; /** * @since JDK1.1 */ public interface Externalizable extends java.io.Serializable { void writeExternal(ObjectOutput out) throws IOException; void readExternal(ObjectInput in) throws IOException, ClassNotFoundException; }
writeExternal() 方法 设置的是 保存哪些属性,
readExternal() 方法,设置的是读取哪些属性。
注意,保存和读取属性的顺序 必须保持一致。
五.一 Externalizable 实现序列化
五.一.一 实体类 实现 接口
public class Person2 implements Externalizable { }
五.一.二 重写 writeExternal() 方法,设置保存的属性
@Override public void writeExternal(ObjectOutput out) throws IOException { //保存哪些, 保存的数据。 out.writeInt(id); out.writeObject(name); //不保存 sex 属性 out.writeInt(age); out.writeObject(desc); }
五.一.三 重写 readExternal() 方法,读取保存的属性
@Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { //读取的, 按照保存的顺序读取 this.id=in.readInt(); this.name=(String)in.readObject(); this.age=in.readInt(); this.desc=(String)in.readObject(); }
五.一.四 序列化单个对象
@Test public void write1Test() throws Exception{ File file=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc" +File.separator+"data4.txt"); ObjectOutputStream objectOutputStream=new ObjectOutputStream(new FileOutputStream(file)); Person2 Person2=new Person2(1,"两个蝴蝶飞",'男',24,"一个快乐的程序员"); //如果没有序列化,会报错。 objectOutputStream.writeObject(Person2); objectOutputStream.close(); }
与 以前的方法是一样的。
运行程序,查看 data4.txt 的内容。
五.一.五 反序列化单个对象
@Test public void read1Test() throws Exception{ File file=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc" +File.separator+"data4.txt"); ObjectInputStream objectInputStream=new ObjectInputStream(new FileInputStream(file)); Object obj= objectInputStream.readObject(); Person2 Person2=(Person2)obj; System.out.println("员工:"+Person2); objectInputStream.close(); }
运行程序:
对象集合的序列化和反序列化与以前的也是一样的,就不重复写了。
五.二 Serializable 和 Externalizable 的区别
开发中,常使用的是 Serializable
序列化非常重要,一定要掌握。
谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!