您当前的位置: 首页 >  Java

星拱北辰

暂无认证

  • 0浏览

    0关注

    1205博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【Java】浅谈关键词transient的使用

星拱北辰 发布时间:2020-02-29 21:11:30 ,浏览量:0

说明

本文的路径被我删了部分,所以复制代码的话要注意自己写好文件的path。

控制序列化IO的类
import java.io.*;

public class PersonMapper {

    private PersonMapper() {}

    private static PersonMapper mapper;

    /**
     * 获取单例
     * @return 单例
     */
    public static PersonMapper getInstance() {
        if (mapper == null) {
            mapper = new PersonMapper();
        }
        return mapper;
    }

    /**
     * 反序列化从文件中读取Person的序列化对象
     */
    public Person readObject() {
        try (ObjectInputStream ois = new ObjectInputStream(
                new FileInputStream("src/com/.../test/serialPerson.dat"))) {
            Person obj = (Person)ois.readObject();
            return obj;
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 序列化对象
     */
    public void writeObject(Person object) {
        try (ObjectOutputStream oos = new ObjectOutputStream(
                new FileOutputStream("src/com/.../test/serialPerson.dat"))) {
            oos.writeObject(object);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
测试类
public class TransientTest {
    public static void main(String[] args) {
        Person person = new Person(1, "Tim", 10);
        PersonMapper mapper = PersonMapper.getInstance();
        mapper.writeObject(person);
        System.out.println(mapper.readObject());
    }
}
使用transient的Person类

注意实现 java.io.Serializable,并写一下serialVersionUID。

注意 transient !!!

public class Person implements Serializable {

    private static final long serialVersionUID = 1L;

    private Integer id;

    private String name;

    private transient Integer age;

    public Person(Integer id, String name, Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public Integer getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

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

}

测试结果:

Person{id=1, name='Tim', age=null}
去掉transient的Person类

只删去 transient:

public class Person implements Serializable {

    private static final long serialVersionUID = 1L;

    private Integer id;

    private String name;

    private Integer age;

    public Person(Integer id, String name, Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public Integer getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

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

}

测试结果:

Person{id=1, name='Tim', age=10}
结论

Java没有把对象被transient标记的属性序列化。

荐读
  • Java transient关键字使用示例
  • Java transient关键字使用小记

Update on 2020.3.7

  • transient修饰的属性不进行序列化的操作,起到一定消息屏蔽 的效果
  • 被transient修饰的属性可以正确的创建,但被系统赋为默认值。 比如,int类型为0,String类型为null

注:ObjectInputStream和ObjectOutputStream类不会保存和 读写对象中的transient和static类型的成员变量

关注
打赏
1660750074
查看更多评论
立即登录/注册

微信扫码登录

0.0711s