序列化的本质其实就是。
将某样东西封装为对象之后,利用序列化转化为二进制文件,再利用字节输出流储存在硬盘中。而反序列化则是把二进制文件在嵌套了输入流的序列化处理下,重新变回原来的样子
这个图片代表我对序列化的理解,同时也是我对于大多数处理流和嵌套的理解
序列化的代码如下
package com.Ioliu; import java.io.*; public class Text_obStream { public static void main(String[] args) throws IOException, ClassNotFoundException { ObjectOutputStream os1=new ObjectOutputStream(new FileOutputStream("D:\\duo.txt")); os1.writeObject("asd"); //此刻变为二进制文件,存在于硬盘之中 ObjectInputStream os2=new ObjectInputStream(new FileInputStream("D:\\duo.txt")); System.out.println(os2.readObject()); //再用对象流进行读取,最终得到的还是这个封装成对象的东西; os2.close(); os1.close(); } }
这里有一点需要注意的是,上面进行序列化的时候,序列化的是一个字符串 字符串这个类本身已经实现了Serializable接口,所以可以正常使用 如果自定义的类没有实现这个接口,序列化时就会出现这种报错 只要实现了就没事情了,详见下方
package com.Ioliu; import java.io.*; public class Io_Stream { public static void main(String[] args) throws IOException, ClassNotFoundException { ObjectOutputStream a1=new ObjectOutputStream(new FileOutputStream("D:\\dio.txt")); //ut是一个类 ut ass=new ut(14122); //如果不插入Serializable接口的话,下面这个写入都会出问题; a1.writeObject(ass); a1.close(); ObjectInputStream a2=new ObjectInputStream(new FileInputStream("D:\\dio.txt")); ut as=(ut)a2.readObject(); System.out.println(as.name); a2.close(); } } class ut implements Serializable{ int name; public ut(int name) { this.name = name; } }
关于数据流
数据流的作用是将基本数据类型和字符串转化为乱码,或者将对应的乱码{有序}地转化为数据类型和字符串。也同样是一种处理流
基本原理也可以用上面序列化和反序列化的图片来理解
import java.io.*; public class Text_data { public static void main(String[] args) throws IOException { //数据输入输出流本质上还是处理流,嵌套的是字节流,用来处理基本数据类型和字符串 //这里接受的直接就是字节流 //DataInputStream di=new DataInputStream(new FileInputStream("")); //输出流的嵌套在下面 /*File a=new File("D:\\duo.txt"); FileOutputStream ot=new FileOutputStream(a);*/ //合在一起写也没什么太大问题啦 DataOutputStream dt=new DataOutputStream(new FileOutputStream("D:\\duo.txt",true)); //若想不覆盖,再文件对象并列的地方明确指出true/false //这里就没写输入流,直接连接好文件输出流,再嵌套上一个数据输出流 dt.writeUTF("22222"); dt.close(); //di.close(); } }
package com.Ioliu; import java.io.DataInputStream; import java.io.FileInputStream; import java.io.IOException; //上一个程序已经利用文件数据输入流 //但是文件里的东西人类是看不懂的 //只能用数据输入流进行逆向识别 public class text_data2 { public static void main(String[] args) throws IOException { //之前那段代码已经把数据全都塞入dou文件里了,这里重新连接上一个数据输入流 DataInputStream da=new DataInputStream(new FileInputStream("D:\\duo.txt")); //再进行文件内容读取 //读取到的东西用变量储存在程序内存中 String sc=da.readUTF(); String sd=da.readUTF(); da.close(); //接下来直接输出变量即可 System.out.println(sc); System.out.println(sd); } } //管道要链接到什么位置一定要明确(有一端是默认连接到程序) //输入时按什么顺序输入的,输出的时候就要安神莫顺序输出 //读取的时候好像自带分隔,也是和输入的时候一样是匹配的次数 //算是紧密结构吗?????