序列化与反序列化 - Java基础

知识的广度来自知识的深度,学习如果不成体系那是多可怕的一件事儿,希望我们在未来的学习道路上坚守初心,不要给自己留下遗憾,以自己喜欢的方式生活,做自己喜欢做的事,宠爱自己,做一个独一无二的自己!对于文章中出现的任何错误请大家批评指出,会及时做出修改!有任何想要讨论和学习的问题可联系我:cittaksana@qq.com序列化与反序列化 - Java基础一、序列化简介二、序列化的使用三、自定义序列化功能3.1 transient关键字的使用3.2 writeObject方法的使用3.3 readO.
摘要由CSDN通过智能技术生成

知识的广度来自知识的深度,学习如果不成体系那是多可怕的一件事儿,希望我们在未来的学习道路上坚守初心,不要给自己留下遗憾,以自己喜欢的方式生活,做自己喜欢做的事,宠爱自己,做一个独一无二的自己!

  • 对于文章中出现的任何错误请大家批评指出,会及时做出修改!
  • 有任何想要讨论和学习的问题可联系我:cittaksana@qq.com

一、序列化简介

在项目中有很多情况需要对实例对象进行序列化与反序列化,这样可以持久的保存对象的状态,甚至在各个组件之间进行对象传递和远程调用。序列化机制是项目中必不可少的常用机制。

要想一个类拥有序列化、反序列化功能,最简单的方法就是实现java.io.Serializable接口,这个接口是一个标记接口(marker Interface),即其内部无任何字段与方法定义。

当我们定义了一个实现Serializable接口的类之后,一般我们会手动在类内部定义一个private static final long serialVersionUID字段,用来保存当前类的序列版本号。这样做的目的就是唯一标识该类,其对象持久化之后这个字段将会保存到持久化文件中,当我们对这个类做了一些更改时,新的更改可以根据这个版本号找到已持久化的内容,来保证来自类的更改能够准确的体现到持久化内容中。而不至于因为未定义版本号,而找不到原持久化内容。

当然如果我们不实现Serializable接口就对该类进行序列化与反序列化操作,那么将会抛出java.io.NotSerializableException异常。
如下:

    public class Student implements Serializable {
   
        private static final long serialVersionUID = -3111843118148L;
        private String name;
        private int age;
        private String sex;
        private String address;
        private String phone;
        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 String getSex() {
   
            return sex;
        }
        public void setSex(String sex) {
   
            this.sex = sex;
        }
        public String getAddress() {
   
            return address;
        }
        public void setAddress(String address) {
   
            this.address = address;
        }
        public String getPhone() {
   
            return phone;
        }
        public void setPhone(String phone) {
   
            this.phone = phone;
        }
    }

二、序列化的使用

虽然要实现序列化只需要实现Serializable接口即可,但这只是让类的对象拥有可被序列化和反序列化的功能,它自己并不会自动实现序列化与反序列化,我们需要编写代码来进行序列化与反序列化。

这就需要使用ObjectOutputStream类的writeObject()方法与readObject()方法,这两个方法分别对应于将对象写入到流中(序列化),从流中读取对象(反序列化)。

Java中的对象序列化,序列化的是什么?答案是对象的状态、更具体的说就是对象中的字段及其值,因为这些值正好描述了对象的状态。

下面的例子我们实现将Student类的一个实例持久化到本地文件“D:/student.txt”中,并从本地文件中读到内存,这要借助于FileOutputStream和FileInputStream来实现:

public class SerilizeTest {
   
        public static void main(String[] args) {
   
            serilize();
            Student s = (Student) deserilize();
            System.out.println("姓名:" + s.getName()+"\n年龄:"+ s.getAge()+"\n性别:"+s.getSex()+"\n地址:"+s.getAddress()+"\n手机:"+s.getPhone());
        }
        public static Object deserilize(){
   
            Student s = new Student();
            InputStream is = null;
            ObjectInputStream ois = null;
            File f = new File("D:/student.txt");
            try {
   
                is = new FileInputStream(f);
                ois = new ObjectInputStream(is);
                s = (Student)ois.readObject();
            } catch (FileNotFoundException e) {
   
                e.printStackTrace();
            } catch (IOException e) {
   
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
   
                e.printStackTrace();
            }finally{
   
                if(ois != null){
   
                    try {
   
                        ois.close();
                    } catch (IOException e
  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值