Java~ transient关键字

首先呢?要了解啥是序列化和啥是反序列化,他们的作用分别是什么呢?
在这里插入图片描述
简单来说:
序列化就是把一个对象保存到一个文件或数据库字段去,而反序列化就是在适当的时候把这个文件再转化成原来的对象使用。
图片更好理解

在这里插入图片描述
学生类

package 文件;

import java.io.Serializable;

public class Student implements Serializable {
    public int getNo() {
        return no;
    }

    public void setNo(int no) {
        this.no = no;
    }

    public String getName() {
        return name;
    }

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

    private  int no;
    private String name;
    public Student(int no, String name) {
        this.no = no;
        this.name = name;
    }
    public String toString(){
        return "学生名字:"+this.getName()+"  学号:"+this.getNo();
    }
}

序列化

package 文件;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class ObjectOutStreamTest01 {
    public static void main(String[] args)throws Exception{
        //创建java对象
        Student s=new Student(1111,"zhangsan");
        ObjectOutputStream cos=new ObjectOutputStream(new FileOutputStream("students"));
        //序列化对象
       /* try {
            ObjectOutputStream cos=new ObjectOutputStream(new FileOutputStream("stusents"));
        } catch (IOException e) {
            e.printStackTrace();
        }*/
       cos.writeObject(s);
        //刷新
        cos.flush();
        //关闭
        cos.close();
    }
}

反序列化

package 文件;

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

public class ObjectInputStreamTest01 {
    public static void main(String[] args)throws Exception{
        ObjectInputStream ios= new  ObjectInputStream(new FileInputStream("students"));
        //反序列化对象
       Object obj=ios.readObject();
       System.out.println(obj);
       ios.close();
    }
}
/*
学生名字:zhangsan  学号:1111

进程已结束,退出代码0
...*/

敲黑板
transient关键字的作用是:被transient关键字修饰的变量不参与序列化和反序列化,当一个对象被序列化的时候,transient型的变量的值不包括在序列化的表示中。

/*
注意:通过源代码发现, Serializable接口只是一个标志接口:
public interface Serializable {
}
这个接口当中什么代码都没有。
那么它起到一个什么作用呢?
起到标识的作用,标志的作用, java虚拟机看到这个类实现了这个接口,可能会对这个类进行特殊待遇。
Serializable这个标志接口是给java虚拟机参考的, java虚拟机看到这个接口之后,会为该类自动生成一个序列化版本号
一次序列化多个对象呢?
可以,可以将对象放到集合当中,序列化集合。
提示:
参与序列化的Arraylist集合以及集合中的元素User都需要实现java. io. Serializable接口。

package 文件;

import java.io.Serializable;
import java.util.Arrays;

public class User implements Serializable {
    private int no;
    private transient  String name;//name不参与序列化操作
    //transient关键字表示游离的,不参与序列化
    public int getNo() {
        return no;
    }

    public void setNo(int no) {
        this.no = no;
    }

    public String getName() {
        return name;
    }

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


    public User(int no, String name){

        this.no = no;
        this.name = name;
    }

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


package 文件;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
public class ObjectOutputStreamTest02 {
    public static void main(String[] args)throws Exception{
        List<User> userlist=new ArrayList<>();
        userlist.add(new User(1,"zhangsan"));
        userlist.add(new User(2,"lisi"));
        userlist.add(new User(3,"wangwu"));
        ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("users"));
        oos.writeObject(userlist);
        oos.flush();;
        oos.close();
    }
}

package 文件;

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

public class ObjectInputStreamTest01 {
    public static void main(String[] args)throws Exception{
        //反序列化对象
          ObjectInputStream ios= new  ObjectInputStream(new FileInputStream("users"));
      
        List<User> userlist=(List<User>)ios.readObject();
        for(User user:userlist){
            System.out.println(user);
        }
       ios.close();
    }
}
/*
User{no=1, name='null'}
User{no=2, name='null'}
User{no=3, name='null'}

进程已结束,退出代码0

 */

想要深入了解->点击我

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值