对象序列化(Object Serialization)

程序运行时可能有需要保存的数据,对于基本数据类型如int、float、char等,可以简单的保存到文件中,程序下次启动时,可以读取文件中的数据初始化程序。但是对于复杂的对象类型,如果需要永久保存,使用上述方法就会复杂一些,需要把对象中不同的属性分解为基本数据类型,然后分别保存到文件中。当程序再次运行时,需要建立新的对象,然后从文件中读取与对象有关的所有数据,再使用这些数据分别为对象的每个属性进行初始化。
使用对象输入输出流实现对象序列化,可以直接存取对象。将对象存入一个流称为序列化,而从一个流将对象读出来被称为反序列化。

  • ObjectInput与ObjectOutput

    ObjectInput接口与ObjectOutput接口分别继承了DataInput和DataOutput接口,提供了对基本数据类型和对象序列化的方法。使用对象序列化功能可以非常方便地将对象写入输出流,或者从输入流对象读取对象。ObjectInput接口与ObjectOutput接口中定义的对象反序列化和序列化方法如下:

    1.readObject()
    所谓反序列化就是从输入流中获取序列化的对象数据,用这些数据生成新的Java对象。该方法定义在ObjectInput接口中,由ObjectInputStream类实现。
    语法如下:

Object object=readObject();
object:Java对象。
注意:使用readObject()方法获取的序列化对象是Object类型的,必须通过强制类型转换才能使用。

2.writeObject()
序列化就是将对象写入到输入流,这个输入流可以是文件输出流、网络输出流以及其他数据输出流。该方法定义在ObjectOutput接口中,由ObjectOutputStream类实现。
语法:

writeObject(Object);
object:将要序列化的对象。
注意:被序列化的对象必须实现java.io.Serializable,否则不能实现序列化。

  • ObjectInputStream与ObjectOutputStream

    Java提供了ObjectInputStream和ObjectOutputStream类读取和保存对象,他们分别是对象输入流和对象输出流。ObjectInputStream类和ObjectOutputStream类是InputStream和OutputStream类的子类,继承了他们所有的方法。
    ObjectInputStream类的构造方法为:

ObjectInputStream(InputStream in)

当准备读取一个对象到程序中时,可以用ObjectInputStream类创建对象输入流。
语法如下:

new ObjectInputStream(in)

ObjectInputStream类读取基本数据类型的方法为:

readObject()

对象输入流使用该方法读取一个对象到程序中。例如:

FileInputStream fis=new FileInputStream("Example.txt");
ObjectInputStream ois=new ObjectInputStream(fis);
ois.readObject();
ois.close();

ObjectOutputStream类的构造方法为:
ObjectOutputStream(OutputStream out)
当准备将一个对象写入到输出流(即序列化),可以用ObjectOutputStream类创建对象输出流。
语法如下:

new ObjectOutputStream(out)

ObjectOutputStream类写入基本数据类型的方法为:

writeObject()

对象输出流使用该方法将一个对象写入到一个文件中。例如:

FileOutputStream fos = new FileOutputStream("Example.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject("Example");
oos.close();

下面给出一个完整示例,该示例实现对用户密码的修改。


public class Example {
    public static void main(String[] args) {
        User user = new User("Tom", "111", 21);
        try {
            FileOutputStream fos = new FileOutputStream("C:\\Example.txt");
            //创建输出流对象,使之可以将对象写入文件中
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            //将对象写入文件
            oos.writeObject(user);
            System.out.println("修改之前用户的信息:");
            System.out.println("用户名:" + user.name);
            System.out.println("原密码:" + user.password);
            System.out.println("年龄:" + user.age);

            FileInputStream fis = new FileInputStream("C:\\Example.txt");
            //创建输入流对象,使之可以从文件中读取数据
            ObjectInputStream ois = new ObjectInputStream(fis);
            user = (User) ois.readObject();
            user.setPassword("222");
            System.out.println("修改之后的用户信息:");
            System.out.println("用户名:" + user.name);
            System.out.println("修改之后的密码:" + user.password);
            System.out.println("年龄:" + user.age);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

class User implements Serializable {
    String name;
    String password;
    int age;

    User(String name, String password, int age) {
        this.name = name;
        this.password = password;
        this.age = age;
    }

    public void setPassword(String password) {
        this.password = password;
    }

}

运行结果如图所示:
这里写图片描述

由图可知,通过序列化和反序列化实现了用户密码的修改

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值