对象流与对象序列化

混江龙づ霸主 提交于 2020-04-01 02:57:18

 对象的序列化过程&

反序列化过程

 

TestObjectInputOutputStream

package com.aff.file;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

import org.junit.Test;

/* 对象的序列化               1. 对象的序列化机制允许内存中的 Java 对象转换成平台无关的二进制流,
                从而允许这种二进制流持久的保存在磁盘上或通过网络将这种二进制流传输到另一个网络节点,
                当其他程序获取这种二进制流,就可以恢复成原来的 Java 对象。
             2. 序列化的好处在于可将任何实现了Serializable接口的对象转化为字节数据,
                使其在保存和传输时可被还原
             3. 序列化是 RMI(Remote Method Invoke – 远程方法调用)过程的参数和返回值都必须实现的机制,
                而 RMI 是 JavaEE 的基础。因此序列化机制是 JavaEE 平台的基础
             4. 如果需要让某个对象支持序列化机制,则必须让其类是可序列化的,
                为了让某个类是可序列化的,该类必须实现如下两个接口之一:                                                               Serializable
                                                              Externalizable

 */
public class TestObjectInputOutputStream {
    // 对象的序列化过程: 将内存中的对象通过ObjectOutputStream转换为二进制流,存储在硬盘中文件中
    @Test
    public void testObjectOutputStream() {
        Person p1 = new Person("芳芳", 25);
        Person p2 = new Person("喵喵", 24);
        ObjectOutputStream oos = null;
        try {
            oos = new ObjectOutputStream(new FileOutputStream("person.txt"));
            oos.writeObject(p1);
            oos.flush();
            oos.writeObject(p2);
            oos.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (oos != null) {
                try {
                    oos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    // 反序列化过程: 将硬盘中的文件通过ObjectInputStream转换为相应的对象
    @Test
    public void testObjectInputStream() {
        ObjectInputStream ois = null;
        try {
            ois = new ObjectInputStream(new FileInputStream("person.txt"));
            Person p1 = (Person) ois.readObject();
            System.out.println(p1);
            Person p2 = (Person) ois.readObject();
            System.out.println(p2);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (ois != null) {
                try {
                    ois.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

// 要实现序列化的类,
// 1.要求这个类是可序列化的: 实现Serializable
// 2.要求类的属性也得实现 Serializable接口
//   提供一个 private static final long serialVersionUID = 2523683981563918904L;
// 4.不能序列化 static和transient(短暂的)修饰的成员变量

class Person implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private Integer age;

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!