IO(6)序列化与反序列化

本次整理的是学习序列化与反序列化的内容

废话少说,先上代码

package com.NicMark.inputStream;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class ObjectInnputStream_ {
    public static void main(String[] args) throws Exception{
        String filePath = "C:\\Users\\DELL\\Desktop\\IO\\file\\data.dat";

        ObjectInputStream obji = null;
        try {
            obji = new ObjectInputStream(new FileInputStream(filePath));

            //读取的顺序(反序列化的顺序)要跟存放的顺序(序列化的顺序)一致
            //否则会出现异常
            System.out.println(obji.readInt());
            System.out.println(obji.readBoolean());
            System.out.println(obji.readChar());
            System.out.println(obji.readDouble());
            System.out.println(obji.readUTF());
            //dog 的编译类型是Obj,运行类型是Dog
            Object o = obji.readObject();
            System.out.println("运行类型="+o.getClass());//在底层把Obj转型成一只狗
            System.out.println("dog信息="+o);



            //如果我们希望调用Dog的方法
            //需要我们向下转型
            //需要我们将Dog类的定义,拷贝到可以引用的地方
            //Dog dog2 = (Dog)dog;

        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            obji.close();
        }
    }
}

package com.NicMark.outputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;

//完成数据的序列化
public class ObjectOutputStream_ {
    public static void main(String[] args) {
        //序列化后,保存的文件格式,不是纯后缀的,而是按照他的格式来保存的
        String filePath = "C:\\Users\\DELL\\Desktop\\IO\\file\\data.dat";
        try {
            ObjectOutputStream obj = new ObjectOutputStream(new FileOutputStream(filePath));
            //序列化数据到data.dat文件中
            //本质是个对象
            obj.writeInt(100);//int -> Integer(实现了 Serializable)
            obj.writeBoolean(true);//boolean -> Boolean(实现了 Serializable)
            obj.writeChar('a');//char -> Character(实现了 Serializable)
            obj.writeDouble(9.5);//double -> Double(实现了 Serializable)
            obj.writeUTF("NicMark");//String(实现了 Serializable)

            //保存一个dog对象
            //系列化某个类的对象,必须将类Serializable
            obj.writeObject(new Dog("WANGCAI",23));
        } catch (IOException e) {
            e.printStackTrace();
        }finally {

        }

}

    }
class Dog implements Serializable {
    private String name;
    private int age;

    public Dog(String name,int age){
        this.name = name;
        this.age = age;
    }
    public String toString(){
        return "Dog{"+
                "Name="+name+'\''+
                ",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;
    }
}

在文本文件保存的时候,经常会设置不同的编码予以保存。IO(6)序列化与反序列化
在系统里,我们默认的编码方式是utf8,但当我们遇到像是jdk或者其他的编码方式的话,会导致字符串乱码的问题,由此,我们的序列化与反序列化就显得尤为重要了。
这是将内容序列化的code

public class ObjectOutputStream_ {
    public static void main(String[] args) {
        //序列化后,保存的文件格式,不是纯后缀的,而是按照他的格式来保存的
        String filePath = "C:\\Users\\DELL\\Desktop\\IO\\file\\data.dat";
        try {
            ObjectOutputStream obj = new ObjectOutputStream(new FileOutputStream(filePath));
            //序列化数据到data.dat文件中
            //本质是个对象
            obj.writeInt(100);//int -> Integer(实现了 Serializable)
            obj.writeBoolean(true);//boolean -> Boolean(实现了 Serializable)
            obj.writeChar('a');//char -> Character(实现了 Serializable)
            obj.writeDouble(9.5);//double -> Double(实现了 Serializable)
            obj.writeUTF("NicMark");//String(实现了 Serializable)

            //保存一个dog对象
            //系列化某个类的对象,必须将类Serializable
            obj.writeObject(new Dog("WANGCAI",23));
        } catch (IOException e) {
            e.printStackTrace();
        }finally {

        }

}

    }
class Dog implements Serializable {
    private String name;
    private int age;

    public Dog(String name,int age){
        this.name = name;
        this.age = age;
    }
    public String toString(){
        return "Dog{"+
                "Name="+name+'\''+
                ",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;
    }
}

当我们序列化的时候,我们需要将相应的内容给他具体的类型传入到文件中,
IO(6)序列化与反序列化

            obj.writeInt(100);//int -> Integer(实现了 Serializable)
            obj.writeBoolean(true);//boolean -> Boolean(实现了 Serializable)
            obj.writeChar('a');//char -> Character(实现了 Serializable)
            obj.writeDouble(9.5);//double -> Double(实现了 Serializable)
            obj.writeUTF("NicMark");//String(实现了 Serializable)

当上面这些进行序列化的时候,自动转换,实现Serializable,
特别的,我们要将一个对象序列化时,

class Dog implements Serializable {
    private String name;
    private int age;

    public Dog(String name,int age){
        this.name = name;
        this.age = age;
    }
    public String toString(){
        return "Dog{"+
                "Name="+name+'\''+
                ",Age="+age+
                '}';
    }

我们必须让这个对象所从属的类class Dog implements Serializable(){},否则,将会报错。
在反序列化的操作时,我们也要通过它相应的类型,进行反序列化操作

System.out.println(obji.readInt());
            System.out.println(obji.readBoolean());
            System.out.println(obji.readChar());
            System.out.println(obji.readDouble());
            System.out.println(obji.readUTF());
            //dog 的编译类型是Obj,运行类型是Dog
            Object o = obji.readObject();
            System.out.println("运行类型="+o.getClass());//在底层把Obj转型成一只狗
            System.out.println("dog信息="+o);

如果说想要单独的调用Dog类的某一个方法,我们需要让其可以被调用,即让它成为一个public型,或者将这个类复制粘贴在这个代码下。

需要注意的是

wirteUTF或者readUTF是读入读出字符串的意思。

今天的总结到这里就结束了

江湖不远,我们有缘再见

上一篇:Serializable


下一篇:IDEA自动生成序列化ID