transient关键字

作用:

transient关键字可以让实现了Serializable接口的类中的属性不被序列化。
就是哪个属性加了transient,他就不能被序列化。
代码证明:
bean:

public class User implements Serializable{
    private  String name;
    private transient int age;
    public  String getName() {
        return name;
    }
    public void setName(String tname) {
        name = tname;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}

主函数:

import java.io.*;
public class MainTest {
    public static void main(String args[]) {
        //初始化用户
        User user=new User();
        user.setAge(18);
        user.setName("ABC");

        System.out.println("read before Serializable");
        System.out.println("name: "+user.getName());
        System.out.println("age: "+user.getAge());

        File file=new File("D:/user.txt");
        if (file.exists()){
            System.out.println("\nfile delete? : "+file.delete());
        }
        //序列化
        try {
            ObjectOutputStream objo=new ObjectOutputStream(new FileOutputStream("D:/user.txt"));
            objo.writeObject(user);;
            objo.flush();
            objo.close();
        }catch (Exception e){
            e.printStackTrace();
        }
        //反序列化
        try {
            ObjectInputStream inputStream=new ObjectInputStream(new FileInputStream("D:/user.txt"));
            User abc= (User) inputStream.readObject();
            System.out.println("\nread after Serializable");
            System.out.println("name: "+abc.getName());
            System.out.println("age: "+abc.getAge());
        }catch (Exception e){
            e.printStackTrace();
        }

    }
}

打印:

read before Serializable
name: ABC
age: 18

file delete? : true

read after Serializable
name: ABC
age: 0

在这里的private transient int age;就没有序列化成功。

此外,static变量修饰的静态变量,也不能被Serializable序列化。我修改了name属性为static变量,重新测试:

public class MainTest {
    public static void main(String args[]) {
        //初始化用户
        User user=new User();
        user.setAge(18);
        User.setName("ABC");

        System.out.println("read before Serializable");
        System.out.println("name: "+user.getName());
        System.out.println("age: "+user.getAge());

        File file=new File("D:/user.txt");
        if (file.exists()){
            System.out.println("\nfile delete? : "+file.delete());
        }
        //序列化
        try {
            ObjectOutputStream objo=new ObjectOutputStream(new FileOutputStream("D:/user.txt"));
            objo.writeObject(user);;
            objo.flush();
            objo.close();
        }catch (Exception e){
            e.printStackTrace();
        }
        //反序列化
        try {
            //在这里改变User的类变量Name属性
            User.setName("DEF");
            ObjectInputStream inputStream=new ObjectInputStream(new FileInputStream("D:/user.txt"));
            User abc= (User) inputStream.readObject();
            System.out.println("\nread after Serializable");
            System.out.println("name: "+abc.getName());
            System.out.println("age: "+abc.getAge());
        }catch (Exception e){
            e.printStackTrace();
        }

    }
}

打印:

read before Serializable
name: ABC
age: 18

file delete? : true

read after Serializable
name: DEF
age: 0

本应该name还是ABC的,但是却出来了DEF,说明这里的name根本不能被序列化,我们读取的是存在内存中的静态变量。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 137,274评论 19赞 139
  • 纯粹是个人学习总结,如有不对的地方请吐槽。 1. transient的作用及使用方法 我们都知道一个对象只要实现了...
    junwu_123阅读 368评论 0赞 0
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 35,354评论 18赞 399
  • 洞庭湖烟波浩渺,万顷银波中的君山云雾缭绕,若隐若现,若沉若浮。九凝山下,白云深处竹海荡荡。斑竹一枝千滴泪的故事就由...
    水乡醉客阅读 1,105评论 0赞 2
  • 看了一下简书里的一些文章,如果不推荐出来,点击量少得可怜。 简书真的对一个写作者有帮助吗?
    平溪江渔夫阅读 318评论 2赞 1

友情链接更多精彩内容