对象流

1. 对象的序列化

  • 对象序列化的目标是将对象保存到磁盘上,或允许在网络中直接传输对象。
  • 序列化是RMI(Remote Method Invoke - 远程方法调用)过程的参数和返回值都必须实现的机制,而RMI是JavaEE的基础。因此序列化机制是JavaEE平台的基础
  • 如果需要让某个对象支持序列化机制,则必须让此类是可序列化的,为了让某各类是可序列化的,该类必须实现如下两个接口之一:
    • Serializable:无任何方法,实现此接口表示可以序列化
    • Externalizable

2.使用对象流序列化对象

  • 若某个类实现了serializable接口,该类的对象就是可序列化的:
    • 创建一个ObjectOutputStream
    • 调用ObjectOutputStream对象的writeObject()方法输出可序列化对象
  • 反序列化
    • 创建一个ObjectInputStream
    • 调用readObject()方法读取六种的对象
  • 如果某个类的字段不是基本数据类型或String类型,而是某一个引用类型,那么这个引用类型必须是可序列化的,否则拥有该类型的Field的类也不能序列化

3. 示例代码

Address类

package com.atguigu.javase.lesson10;

import java.io.Serializable;

public class Address implements Serializable {
    private String city;

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public Address(String city) {
        this.city = city;
    }

    public Address() {
    }

    @Override
    public String toString() {
        return "Address{" +
                "city='" + city + '\'' +
                '}';
    }
}

Person类:

package com.atguigu.javase.lesson10;

import java.io.Serializable;

public class Person implements Serializable{

    //类的版本号,用于对象的序列化,具体用于读取对象时比对硬盘上的对象版本和程序中的对象的版本是否一致,
    //若不一致,读取失败,并抛出异常
    private static final long serialVersionUID = -297923778545480370L;
    private String name;
    private int age;
    private Address address;

    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;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    public Person(String name, int age, Address address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }

    public Person() {
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", address=" + address +
                '}';
    }
}

SerializableTest类:

package test.com.atguigu.javase.lesson10; 

import com.atguigu.javase.lesson10.Address;
import com.atguigu.javase.lesson10.Person;
import org.junit.Test;

import java.io.*;

public class SerializableTestTest { 

    @Test
    public void testSerializable() throws IOException {

        Person person = new Person("AA",12,new Address("beijing"));

        //使用ObjectOutputStream把对象写到硬盘上
        OutputStream out = new FileOutputStream("obj.txt");
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(out);

        objectOutputStream.writeObject(person);

        out.close();
        objectOutputStream.close();
    }

    @Test
    public void testInputObjectStream() throws IOException, ClassNotFoundException {
        InputStream in = new FileInputStream("obj.txt");
        ObjectInputStream objectInputStream = new ObjectInputStream(in);

        Object obj = objectInputStream.readObject();
        System.out.println(obj);

        objectInputStream.close();
        in.close();
    }
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值