Java序列化(学习笔记)

序列化:Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。

将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化,也就是说,对象的类型信息、对象的数据,还有对象中的数据类型可以用来在内存中新建对象。

简单的说:序列化可将对象(一切皆为对象)存入文件,反序列化则将对象信息提取出来,就像把信息存到文件里,掉电后再取出信息回到上一次运行的状态。

引用菜鸟教程Java 序列化 | 菜鸟教程 (runoob.com)

要序列化的类(对象)必须实现 java.io.Serializable 接口。

该类的所有属性必须是可序列化的。如果有一个属性不是可序列化的,则该属性必须注明是短暂的。

如果你想知道一个 Java 标准类是否是可序列化的,请查看该类的文档。检验一个类的实例是否能序列化十分简单, 只需要查看该类有没有实现 java.io.Serializable接口。

比如将list(Arraylist类的顺序表)序列化到文件,并反序列化读取。

先创建person类实现接口

 package com3_7_javatest;

import java.util.Objects;

public class person  implements java.io. Serializable{

   public String name;
    public  String id;

    public  person(String name ,String id){
        this.name=name;
        this.id=id;

    }

    public String getName() {
        return name;
    }

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

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "person{" +
                "name='" + name + '\'' +
                ", id='" + id + '\'' +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        person person = (person) o;
        return Objects.equals(name, person.name) &&
                Objects.equals(id, person.id);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, id);
    }
}

序列化列表(列表中为若干个对象)存文件和反序列化

package com3_7_javatest;


import java.io.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;


public class SeriallizeTest {
    public static void main(String[] args) {

        try {

            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("G:\\Serial.txt"));
            List list=new ArrayList();

            person a=new person("里斯","uioq");
            person b=new person( "里斯2","popq");
            person c=new person( "里斯3","qwer");
            list.add(a);
            list.add(b);
            list.add(c);
            oos.writeObject(list);
            oos.close();
        }
        catch (Exception e) {
            System.out.println("异常");
        }


        try {


            ObjectInputStream read = new ObjectInputStream(new FileInputStream("G:\\Serial.txt"));
            Object obj = read.readObject();
        List mylist=(List)obj;
            Iterator iterator=mylist.iterator();
            while (iterator.hasNext()){
                System.out.println(iterator.next().toString());
            }

            read.close();


        }
        catch (Exception e){

        }


    }
}

这种序列化在写各种所谓的增删改查系统中比文件操作更加简单(比如可以将一个对象顺序表存文件中,又能简单高效地直接读出来),若是用transient修饰的成员变量的值则不会被序列化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值