对象序列化和反序列化(九)下

简介: 对象序列化和反序列化(九)

三. 反序列化 ObjectInputStream


三.一 方法


三.一.一 构造方法


三.一.一.一 方法


image.png


三.一.一.二 演示


  @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));
    }


三.一.二 读取方法


image.png


对于 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();
    }


运行程序,查看控制台打印输出:


20200618163029875.png


三.二.二 读取序列化的对象集合


 @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();
    }


运行程序,查看控制台打印输出:


20200618163035163.png


可以正确的读取。


四. 序列化部分属性 transient


有时候,一个实体类中属性过多,不需要全部保存起来,或者某个属性太重要,需要保证安全,不能存储起来, 那么就需要 使用 transient 关键字进行阻止序列化。


如 阻止序列化 name 和 sex


20200618163040852.png


重新运行一下 write2Test() 和 read2Test() 方法,查看控制台


20200618163045753.png


就发现, 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 的内容。


20200618163054878.png


五.一.五 反序列化单个对象


 @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();
    }


运行程序:


2020061816310082.png


对象集合的序列化和反序列化与以前的也是一样的,就不重复写了。


五.二 Serializable 和 Externalizable 的区别


image.png


开发中,常使用的是 Serializable

序列化非常重要,一定要掌握。


谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!

相关文章
|
2月前
|
存储 C#
C#中的序列化和反序列化
C#中的序列化和反序列化
12 0
|
2月前
|
JSON Java API
GSON 泛型对象反序列化解决方案
GSON 泛型对象反序列化解决方案
|
2月前
|
存储 Java 数据库
|
20天前
|
存储 Java
Java输入输出:解释一下序列化和反序列化。
Java中的序列化和反序列化是将对象转换为字节流和反之的过程。ObjectOutputStream用于序列化,ObjectInputStream则用于反序列化。示例展示了如何创建一个实现Serializable接口的Person类,并将其序列化到文件,然后从文件反序列化回Person对象。
26 5
|
2月前
|
存储 C#
C#中的序列化和反序列化案例
C#中的序列化和反序列化案例
14 0
|
2月前
|
JSON Java Maven
使用Jackson进行 JSON 序列化和反序列化
使用Jackson进行 JSON 序列化和反序列化
29 0
|
2月前
|
JSON Android开发 数据格式
android 使用GSON 序列化对象出现字段被优化问题解决方案
android 使用GSON 序列化对象出现字段被优化问题解决方案
|
2月前
|
存储 JSON 网络协议
【计算机网络】序列化,反序列化和初识协议
【计算机网络】序列化,反序列化和初识协议
|
3月前
|
vr&ar
MFC序列化及反序列化变量
MFC序列化及反序列化变量
16 0
|
3月前
|
vr&ar
MFC序列化及反序列化对象
MFC序列化及反序列化对象
18 0

热门文章

最新文章