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修饰的成员变量的值则不会被序列化。

posted @   昊月光华  阅读(6)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示