transient修饰的变量可以被序列化吗?

看到网上很多博客都是写到transient修饰的变量不可以被序列化,
实际上其变量可以被序列化,《Java编程思想》上写的很清楚。

事实证明:看博客不如看书(看经典书籍),看书不如自己码代码验证

代码是借鉴别人的,为了验证问题,直接上代码:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class PasswordFormat implements Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private String name;
    private transient String password;
    public PasswordFormat(String name, String password) {
        this.name = name;
        this.password = password;
    }
    public PasswordFormat() {
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    private void writeObject(ObjectOutputStream oos) throws IOException {//重写以下两个方法,完成序列化时password的加密和解密
        oos.defaultWriteObject();
        char a[]=this.password.toCharArray();
        String str="";
        for(int i=0;i<a.length;i++){
            a[i]+=i;
            str+=a[i];
        }//各项加i再逆置;
        StringBuilder sb = new StringBuilder(str);
        oos.writeObject(sb.reverse().toString());
    }
    private void readObject(ObjectInputStream ois)
            throws ClassNotFoundException, IOException {
        ois.defaultReadObject();
        String str = (String) ois.readObject();
        System.out.println("解密后:" + str);
        StringBuilder sb = new StringBuilder(str);
        sb.reverse();
        char a[]=sb.toString().toCharArray();
        str="";
        for(int i=0;i<a.length;i++){
            a[i]-=i;
            str+=a[i];
        }
        this.password = str;
    }

    @Override
    public String toString() {
        return "PasswordFormat [name=" + name + ", password=" + password + "]";
    }
    public static void serializeTemp(PasswordFormat ob,File file){
        try(
                ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(file));
                ObjectInputStream ois=new ObjectInputStream(new FileInputStream(file));
                ){
            oos.writeObject(ob);
            oos.flush();
            System.out.println((PasswordFormat)ois.readObject());
        }catch(IOException | ClassNotFoundException e){
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        PasswordFormat pf=new PasswordFormat("xcw","xcw12345678");
        File file=new File("./yj.txt");
        PasswordFormat.serializeTemp(pf,file);
    }
}
image

上图可以看到,只要重写writeObject和readObject,

  • 非transinent修饰的变量使用defaultWriteObject()和defaultReadObject()进行序列化和反序列化
  • transient修饰的变量必须手动使用writeObject()和readObject()进行序列化和反序列化
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • JAVA序列化机制的深入研究 对象序列化的最主要的用处就是在传递,和保存对象(object)的时候,保证对象的完整...
    时待吾阅读 13,758评论 0 24
  • 官方文档理解 要使类的成员变量可以序列化和反序列化,必须实现Serializable接口。任何可序列化类的子类都是...
    狮_子歌歌阅读 7,148评论 1 3
  • 在Java中,我们可以通过多种方式来创建对象,并且只要对象没有被回收我们都可以复用该对象。但是,我们创建出来的这些...
    懒癌正患者阅读 5,481评论 0 12
  • 今天林林一家计划到访,爸爸前一晚说早起准备早餐,去超市,打扫卫生。。。结果结果,客人已经都在路上了,才吃上早餐。 ...
    Min_Xu阅读 1,189评论 0 1
  • 末次例假是12月4日预产期是9月14日。经历了痛苦的孕吐期,吐的人不像人鬼不像鬼,什么胃酸啊食道血啊胆汁啊都吐出来...
    Daisy桥阅读 1,391评论 0 0

友情链接更多精彩内容