博主前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住也分享一下给大家,
点击跳转到网站
对象序列化机制:
允许把内存中的java对象转换成平台无关的二进制流,从而允许把这种二进制流永久的保存到磁盘上,或通过网络将这种二进制流传输到另一个网络节点。(序列化)
当其他程序获取了这种二进制流,就可以恢复成原来的java对象。(反序列化)
序列化的理解:
反序列化的理解:
一、对象流的使用一:ObjectOutputStream和ObjectInputStream
1.使用ObjectOutputStream进行序列化操作,具体代码如下:
/**
* 演示ObjectOutputStream的使用,完成数据的序列化
*/
public class ObjectOutputStream_ {
public static void main(String[] args) {
//序列化后,保存的文件格式,不是存文本,而是按照它的格式来保存
String filePath = "D:\\data.dat";
ObjectOutputStream objectOutputStream = null;
try {
objectOutputStream = new ObjectOutputStream(new FileOutputStream(filePath));
//序列化数据到D:\\data.dat
objectOutputStream.writeInt(100); //int ->Integer(实现了Serializable接口)
objectOutputStream.writeBoolean(true); //boolean->Boolean(实现了Serializable接口)
objectOutputStream.writeDouble(90.5); //double->Double(实现了Serializable接口)
objectOutputStream.writeUTF("筱路");
//保存一个Dog对象
objectOutputStream.writeObject(new Dog("小黄", 3));
System.out.println("数据保存完毕(序列化形式)");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (objectOutputStream != null) {
objectOutputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
2.使用ObjectInputStream进行反序列化操作,具体代码如下:
public class ObjectInputStream_ {
public static void main(String[] args) {
//指定反序列化的文件
String filePath = "D:\\data.dat";
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(new FileInputStream(filePath));
//读取
//1.读取(序列化)的顺序需要和你保存(序列化)的顺序一致
//2.否则会出异常
System.out.println(ois.readInt());
System.out.println(ois.readBoolean());
System.out.println(ois.readDouble());
System.out.println(ois.readUTF());
//dog的编译类型是Object,dog的运行类型是Dog
Object dog = ois.readObject();
System.out.println("运行类型=" + dog.getClass());
System.out.println("dog信息=" + dog);
//注意细节
//1.如果我们希望调用Dog的方法,需要向下转型
//2.需要我们将Dog类的定义,放在可以引用的位置
Dog dog2 = (Dog) dog;
System.out.println(dog2.getName());
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
} finally {
try {
if (ois != null) {//关闭流,关闭外层流即可,底层会关闭FileInputStream流
ois.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
具体日志输出信息为:
100
true
90.5
筱路
运行类型=class file.outputStream_.Dog
dog信息=Dog{name='小黄', age=3}
小黄
二、对象流的使用二:ObjectOutputStream和ObjectInputStream
/**
* 序列化过程:将内存中的java对象保存到磁盘中或通过网络传输出去
* 使用ObjectOutputStream实现
*/
@Test
public void test1(){
ObjectOutputStream oos = null;
try {
//造文件和处理流
oos = new ObjectOutputStream(new FileOutputStream("object.dat"));
//把数据写出到磁盘中
oos.writeObject("程序员");
oos.flush();//刷新操作
}catch (Exception e){
e.printStackTrace();
}finally {
if (oos!=null){
//关闭资源
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 反序列化过程:将磁盘文件中的对象还原为内存中的一个java对象
* 使用ObjectInputStream实现
*/
@Test
public void test2(){
ObjectInputStream ois=null;
try {
//造文件和对象流
ois = new ObjectInputStream(new FileInputStream("object.dat"));
//把数据读入到内存中
Object oj = ois.readObject();
String s = (String) oj;
System.out.println(s);
}catch (Exception e){
e.printStackTrace();
}finally {
if (ois!=null){
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}