精华内容
下载资源
问答
  • Java中transient关键字

    2019-06-12 21:24:59
    Java中transient关键字1.只要这个类实现了Serilizable接口,这个类的所有属性和方法都会自动序列化。 2.如果在实现了Serilizable接口的类中,对该类的某属性添加transient关键字,那么在序列化对象的时候,这个属性...

    Java中transient关键字
    1.只要这个类实现了Serilizable接口,这个类的所有属性和方法都会自动序列化。 
    2.如果在实现了Serilizable接口的类中,对该类的某属性添加transient关键字,那么在序列化对象的时候,这个属性就不会被序列化。 
    3.transient关键字只能修饰变量,而不能修饰方法和类。

        Java的serialization提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的对象数据成员,我们不想用serialization机制来保存它。为了在一个特定对象的一个域上关闭serialization,可以在这个域前加上关键字transient。比如,密码字段是非常敏感的字段,所在类在序列化时,不允许写到文件。

        transient是Java语言的关键字,用来表示一个域不是该对象串行化的一部分。当一个对象被串行化的时候,transient型变量的值不包括在串行化的表示中,然而非transient型的变量是被包括进去的。 

    注意static变量也是可以串行化的。

    原文:https://blog.csdn.net/liu16659/article/details/80457688 

    网址:https://www.cnblogs.com/wangmingshun/p/5389042.html

     

     

    展开全文
  • 主要介绍了java中transient关键字用法,以实例形式分析了java中transient关键字的功能及使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
  • JAVA中transient 关键字

    2019-03-18 15:09:20
    今天学习到对象流,序列化反序列化的时候,老师用了一个transient关键字来防止某个属性被序列化,脑子一头懵逼,于是在网上看到了找了别人的博客,也不算是豁然开朗,也算是有点认识。 大佬写的JAVA中的关键字 ...

    今天学习到对象流,序列化反序列化的时候,老师用了一个transient关键字来防止某个属性被序列化,脑子一头懵逼,于是在网上看到了找了别人的博客,也不算是豁然开朗,也算是有点认识。

    大佬写的JAVA中的关键字 transient

    展开全文
  • java中transient关键字

    2020-04-09 21:20:56
    注意,本地变量是不能被transient关键字修饰的。 2、被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化(Externalizable可以实现静态变量序列化)。 3、一旦变量被...

    一、
    1、关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。
    2、被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化(Externalizable可以实现静态变量序列化)。
    3、一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。也可以认为在将持久化的对象反序列化后,被transient修饰的变量将按照普通类成员变量一样被初始化。

    我们知道在Java中,对象的序列化可以通过实现两种接口来实现,若操作的是一个Serializable对象,则所有的序列化将会自动进行,若操作的是 一个Externalizable对象,则没有任何东西可以自动序列化,需要在writeExternal方法中进行手工指定所要序列化的变量,这与是否被transient修饰无关。

    二、
    1.Serializable

    import java.io.*;
    
    public class Person implements Serializable
    {
        private static String name = null;
        private transient int age = 0;
    
        // 默认的构造函数必须有,而且可见性为public,反序列化会用到。
        // 否则会报java.io.InvalidClassException: Person; no valid constructor错误
        public Person(){}
    
        Person(String name, int age)
        {
            this.name = name;
            this.age = age;
        }
    
        public String getName()
        {
            return name;
        }
    
        public void setName(String name)
        {
            this.name = name;
        }
    
        public int getAge()
        {
            return age;
        }
    
        public void setAge(int age)
        {
            this.age = age;
        }
    
        @Override public String toString()
        {
            return "name is " + getName() + " and age is " + getAge();
        }
    
        /*@Override
        public void writeExternal(ObjectOutput out) throws IOException {
            out.writeObject(name);
            out.write(age);
        }
    
        @Override
        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
            name = (String)in.readObject();
            age = in.read();
        }*/
    }
    

    测试类:

    import java.io.*;
    
    public class Test {
    
    
        public static void main(String[] args) throws IOException, ClassNotFoundException
        {
            Person person = new Person("zhangsir", 18);
            System.out.println(person);
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("d://test.txt"));
            oos.writeObject(person);
            oos.close();
    
            person.setName("lisi");
            person.setAge(68);
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream("d://test.txt"));
            Person person1 = (Person) ois.readObject();
            System.out.println(person1);
        }
    
    }
    

    运行结果:
    name is zhangsir and age is 18
    name is lisi and age is 0

    age没有被序列化,name因为静态变量在全局区,本来流里面就没有写入静态变量,静态变量会去全局区查找,而我们的序列化是写到磁盘上的,所以JVM查找这个静态变量的值,是从全局区查找的,而不是磁盘上。person.setName(“lisi”);,被写到了全局区,其实就是方法区,只不过被所有的线程共享的一块空间。

    2、Externalizable

    import java.io.Externalizable;
    import java.io.IOException;
    import java.io.ObjectInput;
    import java.io.ObjectOutput;
    
    public class Person implements Externalizable
    {
        private static String name = null;
        private transient int age = 0;
    
        // 默认的构造函数必须有,而且可见性为public,反序列化会用到。
        // 否则会报java.io.InvalidClassException: Person; no valid constructor错误
        public Person(){}
    
        Person(String name, int age)
        {
            this.name = name;
            this.age = age;
        }
    
        public String getName()
        {
            return name;
        }
    
        public void setName(String name)
        {
            this.name = name;
        }
    
        public int getAge()
        {
            return age;
        }
    
        public void setAge(int age)
        {
            this.age = age;
        }
    
        @Override public String toString()
        {
            return "name is " + getName() + " and age is " + getAge();
        }
    
        @Override
        public void writeExternal(ObjectOutput out) throws IOException {
            out.writeObject(name);
            out.write(age);
        }
    
        @Override
        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
            name = (String)in.readObject();
            age = in.read();
        }
    }
    

    测试类同上,
    运行结果:
    name is zhangsir and age is 18
    name is zhangsir and age is 18
    可见,使用Externalizable接口可以实现对静态变量的序列化。

    三、序列化类中serialVersionUID的作用

    一般在支持序列化的类中,都会设置一个serialVersionUID(序列化版本号)。这个变量用于在反序列化过程控制是否支持反序列化重构,即是否允许两个不同类的对象进行转化。如果两个类的serialVersionUID不同,那么在反序列化过程中就会报错失败。这个字段的设置,一般有三种情况,分别是默认不指定,手动指定为1L(或者其他固定值),自动生成64位hash值。

    如果不在类中显示指定,那么JVM会在编译的时候根据类的名称,属性和方法等自动分配一个默认值。如此每个类的serialVersionUID都是不同的。此种情况下,也就不允许反序列化重构,即一个类对象的序列化结果不允许反序列化成其他类的对象。
    如果手动在类中指定该字段的值为1L(或者其他固定值),那么就会出现很多类的serialVersionUID字段是相同的。这种情况,一般是不会有问题的,因为该字段只是控制了多个类是否可以反序列化重构。实际代码中具体反序列化成哪个类,还是依靠编码人员根据自己的逻辑去进行指定的。
    该字段也可以使用ide来生成,这种生成的方式与第一种情况相同,所以都是不同的。但是编码人员可以根据业务逻辑去修改该字段。如果需要多个类支持反序列化重构,则修改成相同的serialVersionUID字段就可以了。
    所以,从严谨程度上来说,是3>2>1,但是这三种情况,都是允许的。

    展开全文
  • java transient关键字

    千次阅读 2018-02-11 23:24:29
    见:...换句话来说就是,用transient关键字标记的成员变量不参与序列化过程。Java的serialization提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的...

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。

    java语言的关键字,变量修饰符,如果用transient声明一个实例变量,当对象存储时,它的值不需要维持。换句话来说就是,用transient关键字标记的成员变量不参与序列化过程。
     
     
     

    Java的serialization提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的对象数据成员,我们不想用serialization机制来保存它。为了在一个特定对象的一个域上关闭serialization,可以在这个域前加上关键字transient。当一个对象被序列化的时候,transient型变量的值不包括在序列化的表示中,然而非transient型的变量是被包括进去的。

     

    例:

    public transient int SSN;

    当属性如上声明时,即使被赋值为 11122333,当其反序列化后SSN的值依旧是0;

    当对象被序列化时,属性 SSN 的值为 111222333,但是因为该属性是短暂的,该值没有被序列化。

    所以反序列化后 Employee 对象的 SSN 属性为 0。

    展开全文
  • Java中Transient关键字

    2019-01-20 11:59:00
    我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这个类实现了Serilizable接口,这个类的所有属性和...
  • Java中Transient关键字解释
  • Java中transient关键字的详细总结

    万次阅读 多人点赞 2018-06-14 22:15:12
    一、概要介绍Java中transient关键字,transient是短暂的意思。对于transient 修饰的成员变量,在类实例的序列化处理过程中会被忽略。 因此,transient变量不会贯穿对象的序列化和反序列化,生命周期仅存于调用者的...
  • 总结一下Java中transient关键字的作用: 首先从transient单词本身的意思来理解,它的英文原意为:短暂的,暂时的 它的作用体现在将数据序列化的时候,你不想把其中的某个属性序列化到文件中,就需要用transient...
  • JAVA中transient关键字的使用 transient这个关键字,在java中大家可能遇到的不多,最近阅读JDK源码的时候看到,和大家分享一下。 transient,在序列化和反序列化的时候,可以进行关键字的屏蔽,只对需要进行持久化的...
  • java中transient关键字的用法其实不用多说,另外需要注意两个问题,这里简单介绍用法及注意事项: 1、实现Serializable后使用transient修改时的字段不能序列化 实现Serializable接口,使用transient修饰type变量...
  • 参考链接: Java中transient关键字 今天学习到对象流,序列化反序列化的时候,老师用了一个transient关键字来防止某个属性被序列化,脑子一头懵逼,于是在网上看到了找了别人的博客,也不算是豁然开朗,也算是...
  • 根据The Java Language Specification, Java SE 8 Edition:变量如果被transient关键字修饰,那么当对这个类的实例进行持久化(Serializable)保存时,这个被修饰的变量不会被持久化。 比如有一个Point类的实例,当...
  • 换句话来说就是,用transient关键字标记的成员变量不参与序列化过程, 一般用来实现表之间字段的关联,加上transient避免在多表关联时,字段反复实例化 entity 类: @ApiModelProperty(value = "更新日期") @Table...
  • 导师让我学习序列化和反序列化的时候才意识到自己的对java中transient关键字不熟。看了很多介绍和学习笔记之后,对transient关键字的使用做一下总结: 如果一个对象只要实现了Serilizable接口,这个类的所有属性和...
  • java transient 关键字意义

    千次阅读 2015-04-24 21:18:48
    译文出处:Why does Java ...java transient 关键字表明了 transient 变量不应该被序列化(transient)。 参考Java Language Specification, Java SE 7 Edition, Section 8.3.1.3. transient Fields:被 transient
  • JAVA中transient关键字作用

    千次阅读 2018-08-01 15:35:59
    首先介绍一下序列化Serializable 通常一个类实现序列化方式是实现序列化接口: class XXX implements Serializable ...transient关键字的作用,在已实现序列化的类,有的变量不需要保存在磁盘,就要tra...
  • 一、transient关键字的作用 1、为了数据安全,避免序列化和反序列化。 解释: 当对象被序列化时,被transient关键字修饰的变量不会被序列化到目标文件; 当对象从序列化文件重构对象时(反序列化过程),被...
  • java中transient和volatile关键字区别在于:
  • 浅谈Java中transient关键字的作用

    千次阅读 2017-07-24 19:24:59
    1、transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。 2、被transient关键字修饰的变量不再能被序列化。 3、一旦变量被transient修饰,变量将不再是对象持久化的一...
  • java中transient关键字简介

    千次阅读 2015-01-12 15:56:18
    java中 transien 关键字 我们都知道一个对象只要实现了 Serilizable 接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这个类实现了...
  • 一个对象只要实现了Serilizable接口,这个对象就可以被序列化,Java的这种序列化模式为开发者提供了很多便利,可以不必关系具体序列化的过程,只要这个类实现了Serilizable接口,这个的所有属性和方法都会自动序列化...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,408
精华内容 563
关键字:

java中transient关键字

java 订阅