对象流的使用以及序列化机制

对象的序列化

对象的序列化机制:

允许把内存中的java对象转换成平台无关的二进制流,从而允许把这种二进制流持久的保存在磁盘上或通过网络将这种二进制流传输到另一个网络节点,当其他程序获取了这种二进制流,就可以恢复成原来的Java对象

优点

将任何实现了Serializable接口的对象转化为字节数据,使其在保存和传输时可被还原

序列化时RMI(Rmote Method Invoke – 远程方法调用)过程的参数和返回值都必须实现的机制,而RMI是javaEE的基础,因此序列化机制是javaEE平台的基础

某个对象支持序列化机制,必须让其类可序列化,实现

Serializable

Externalizable

@Test
    public void test01(){
        Person p1 = new Person("小米", 24);
        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 {
            try {
                oos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}


class Person implements Serializable {
    String name;
    Integer age;

    public Person() {
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

对象的反序列化过程,将硬盘中的文件通过ObjectInputStream转换为相应的对象

  1. 类是可以序列化的,实现序列化接口
  2. 要求类的属性要实现序列化接口
  3. 凡是实现Serializable接口的类,都有一个表示序列化版本标识符的静态变量

private static final long serialVersionUID;

serialVersionUID

表示类的不同版本键的兼容性,如果类没有显示定义这个静态变量,它的值是java运行时环境根据类的内部细节自动生成的,若类的源代码做了修改,serialVersionUID可能发生变化,故建议显式声明

显示定义serialVersionUID的用途

类的不同版本对序列化兼容,因此需确保类的不同版本具有相同的serialVersionUID

不希望类的不同版本对序列化兼容,因此需确保类的不同版本具有不同的serialVersionUID

扫描二维码关注公众号,回复: 4630260 查看本文章

在Person类中增加

private static final long serialVersionUID =1L;

读取类的对象

@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 (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }finally {
        if (ois != null){
            try {
                ois.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

注意事项:

ObjectOutputStream和ObjectInputStream不能序列化static和teansient修饰的成员变量

猜你喜欢

转载自blog.csdn.net/wwwzydcom/article/details/85056110
今日推荐