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

    2017-12-12 09:40:01
    java这么久居然都不知道这个关键字,...这个关键字在java中的作用就是用它修饰的字段在被反序列化时会被忽略掉,什么意思呢。。我们来看看: public class Student implements Serializable { private String n

    用java这么久居然都不知道这个关键字,最近在读effective_java时才发现了,,于是去看了看这个关键字
    transient,汉语意思短暂的,瞬态.这个关键字在java中的作用就是用它修饰的字段在被反序列化时会被忽略掉,什么意思呢。。我们来看看:

    public class Student implements Serializable {
    
        private String name;
    
        // transient修饰了age字段
        private transient Integer age;
        ...
    }

    因为Student类的age字段是被transient修饰的,所以我们来看一段代码的结果:

    
            Student student = new Student();
            student.setAge(12);
            student.setName("sam");
    
            System.out.println(student);
    
            // 序列化
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("s.out"));
            oos.writeObject(student);
            oos.close();
    
            // 反序列化
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream("s.out"));
            Object o = ois.readObject();
            ois.close();
            System.out.println(o);

    try,catch的为了简便就省略了,结果:
    result
    可以看到,在反序列化后,age变成了null,这就是transient关键字的作用

    展开全文
  • Java transient关键字

    2015-12-13 14:36:54
    最近看JDK源码,发现很多的变量用transient修饰,竟然不知道这个transient到底是什么意思,不觉让我这个自认为精通Java的人惊出一身冷汗,赶紧查了一下有关transient的只是,总是又长知识了,活到老学到老,我还只是...

       最近看JDK源码,发现很多的变量用 transient修饰,竟然不知道这个 transient到底是什么意思,赶紧查了一下有关 transient的只是,总是又长知识了,活到老学到老,我还只是个菜鸟(还挺押韵!!!)。。。。。。

          我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这个类实现了Serilizable接口,这个类的所有属性和方法都会自动序列化。

          然而在实际开发过程中,我们常常会遇到这样的问题,这个类的有些属性需要序列化,而其他属性不需要被序列化,打个比方,如果一个用户有一些敏感信息(如密码,银行卡号等),为了安全起见,不希望在网络操作(主要涉及到序列化操作,本地序列化缓存也适用)中被传输,这些信息对应的变量就可以加上transient关键字。换句话说,这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化。

          总之,java 的transient关键字为我们提供了便利,你只需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中。

     

    没有代码说个JB:

     

     

    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.io.Serializable;
    
    public class TransientTest {
        
        public static void main(String[] args) {
            
            User user = new User();
            user.setUsername("sss");
            user.setPasswd("123456");
            
            System.out.println("read before Serializable: ");
            System.out.println("username: " + user.getUsername());
            System.err.println("password: " + user.getPasswd());
            
            try {
                ObjectOutputStream os = new ObjectOutputStream(
                        new FileOutputStream("C:/user.txt"));
                os.writeObject(user); 
                os.flush();
                os.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                ObjectInputStream is = new ObjectInputStream(new FileInputStream(
                        "C:/user.txt"));
                user = (User) is.readObject(); 
                is.close();
                
                System.out.println("\nread after Serializable: ");
                System.out.println("username: " + user.getUsername());
                System.err.println("password: " + user.getPasswd());
                
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    }
    
    class User implements Serializable {
        private static final long serialVersionUID = 8294180014912103005L;  
        
        private String username;
        private transient String passwd;
        
        public String getUsername() {
            return username;
        }
        
        public void setUsername(String username) {
            this.username = username;
        }
        
        public String getPasswd() {
            return passwd;
        }
        
        public void setPasswd(String passwd) {
            this.passwd = passwd;
        }
    
    }

     

     

     

     

     

    输出为:

     

    read before Serializable: 
    username: sss
    password: 123456
    
    read after Serializable: 
    username: sss
    password: null

     

     

     

    密码字段为null,说明反序列化时根本没有从文件中获取到信息。

    总结:

    (1)一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。

    (2)transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口。

    (3)被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。

        第三点可能有点儿不好理解,因为发现在User类中的username字段前加上static关键字后,程序运行结果依然不变,即static类型的username也读出来为“sss”了,这不与第三点说的矛盾吗?实际上是这样的:第三点确实没错(一个静态变量不管是否被transient修饰,均不能被序列化),反序列化后类中static型变量username的值为当前JVM中对应static变量的值,这个值是JVM中的不是反序列化得出的

    下面我们来证明:

     

     

    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.io.Serializable;
    
    public class TransientTest {
        
        public static void main(String[] args) {
            
            User user = new User();
            user.setUsername("sss");
            user.setPasswd("123456");
            
            System.out.println("read before Serializable: ");
            System.out.println("username: " + user.getUsername());
            System.err.println("password: " + user.getPasswd());
            
            try {
                ObjectOutputStream os = new ObjectOutputStream(
                        new FileOutputStream("C:/user.txt"));
                os.writeObject(user); // 将User对象写进文件
                os.flush();
                os.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                // 在反序列化之前改变username的值
                User.username = "aaa";
                
                ObjectInputStream is = new ObjectInputStream(new FileInputStream(
                        "C:/user.txt"));
                user = (User) is.readObject(); // 从流中读取User的数据
                is.close();
                
                System.out.println("\nread after Serializable: ");
                System.out.println("username: " + user.getUsername());
                System.err.println("password: " + user.getPasswd());
                
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    }
    
    class User implements Serializable {
        private static final long serialVersionUID = 8294180014912103005L;  
        
        public static String username;
        private transient String passwd;
        
        public String getUsername() {
            return username;
        }
        
        public void setUsername(String username) {
            this.username = username;
        }
        
        public String getPasswd() {
            return passwd;
        }
        
        public void setPasswd(String passwd) {
            this.passwd = passwd;
        }
    
    }

     

     

     

     

     

    运行结果为:

     

    read before Serializable: 
    username: sss
    password: 123456
    
    read after Serializable: 
    username: aaa
    password: null

     

     

     

    这说明反序列化后类中static型变量username的值为当前JVM中对应static变量的值,为修改后aaa,而不是序列化时的值sss。

     

      那么是否被 transient修饰的变量就一定不能被事例化呢?答案是否定的。

    为什么呢,因为实现序列化有两种的方式,一个是实现Serializable借口,而另一个是实现Externalizable接口。

       若实现的是Serializable接口,则所有的序列化将会自动进行。

       若实现的是Externalizable接口,则没有任何东西可以自动序列化,需要在writeExternal方法中进行手工指定所要序列化的变量,这与是否被transient修饰无关。

     

    为证明以上说法,我们再看一个例子:

     

     

    import java.io.Externalizable;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectInput;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutput;
    import java.io.ObjectOutputStream;
    
    public class ExternalizableTest implements Externalizable {
    
        private transient String content = "是的,我将会被序列化,不管我是否被transient关键字修饰";
    
        @Override
        public void writeExternal(ObjectOutput out) throws IOException {
            out.writeObject(content);
        }
    
        @Override
        public void readExternal(ObjectInput in) throws IOException,
                ClassNotFoundException {
            content = (String) in.readObject();
        }
    
        public static void main(String[] args) throws Exception {
            
            ExternalizableTest et = new ExternalizableTest();
            ObjectOutput out = new ObjectOutputStream(new FileOutputStream(
                    new File("test")));
            out.writeObject(et);
    
            ObjectInput in = new ObjectInputStream(new FileInputStream(new File(
                    "test")));
            et = (ExternalizableTest) in.readObject();
            System.out.println(et.content);
    
            out.close();
            in.close();
        }}
    

     

     

     

     

     

    运行结果就是:

     

    是的,我将会被序列化,不管我是否被transient关键字修饰

     

     

     

     

    展开全文
  • 在LinkedHashMap 类中,看到有个关键字transient,它是什么意思呢? 下面援引百度百科解释: Java的serialization提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的对象数据成员,我们不想用...

    在LinkedHashMap 类中,看到有个关键字transient,它是什么意思呢?

     

    下面援引百度百科解释:
    Java的serialization提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的对象数据成员,我们不想用serialization机制来保存它。为了在一个特定对象的一个域上关闭serialization,可以在这个域前加上关键字transient。当一个对象被序列化的时候,transient型变量的值不包括在序列化的表示中,然而非transient型的变量是被包括进去的。啰嗦了那么多,其实就一句话:

    结论:将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会被序列化。

     

    被静态变量 和 transient 修饰的变量能被序列化吗?

    也许我们会好奇以下变量能否被序列化呢?答案:不能。

    • static String psw,不能被序列化
    • static transient String psw,不能被序列化

    因为静态变量通常存储在进程的全局区,虚拟机会根据static 关键字,去全局区寻找。
    而序列化后的内容是保存在磁盘文件,自然就无法找到了。

     

    应用场景

    那在实际开发中,有什么业务场景适用呢?举个比较常见的例子:以个人为中心的账户系统,一般会在内存缓存了一些敏感信息,如登录密码、token令牌等,我们不应该通过序列化把它们保存到本地,否则会造成敏感信息泄露。因此这些属性用transient修饰,最合适不过了。

     

    展开全文
  • 关于java关键字transient

    2018-04-01 18:50:06
    以前不知道transient什么意思,现在特意补充下知识的盲点。1.transient的作用和使用方法当一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以...

    查看ArrayList和LinkedList源代码,里面有一个关键字transient。

    以前不知道transient是什么意思,现在特意补充下知识的盲点。

    1.transient的作用和使用方法

    当一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关心具体序列化的过程,只要这个类实现了Serilizable接口,这个类的所有属性和方法都会自动序列化。

    然而在在实际开发过程中,我们常常会遇到这样的问题,这个类的有些属性需要序列化,而其他属性不需要序列化,打个比方,如果一个用户有一些敏感信息(如密码、银行卡号等),为了安全起见,不希望在网络操作(主要涉及到序列化操作,本地序列化缓存也使用)中被传输,这些信息对应的变量就可以加上transient关键字。换句话说,这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化。

    总之,java的transient关键字为我们提供便利,你只需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会列到指定的目的地中。

    2.transient使用小结

    1).一旦变量被transient修饰,变量不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。

    2).transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义变量,则该类需要实现Serilizable接口。

    3).被transient关键字修饰的变量不再被序列化,一个静态变量不管是否被transient修饰,均不能不序列化。

    反序列化后类中static型变量值为当前JVM中对应static变量的值,这个值是JVM中不是反序列化得出的,

    3.transient使用细节--被transient关键字修饰的变量真的不能被序列化吗?

    我们知道在java中,对象的序列化可以通过实现两种接口来实现,若实现的是Serilizable接口,则所有的序列化将会自动进行,若实现的Externalizable接口,则没有任何东西可以自动序列化,需要在writeExternal方法中进行手工指定所要序列化的变量,这与是否被transient修饰无关,因此第二个例子输出的是变量content初始化的内容,而不是null。


    展开全文
  • Javatransient的使用说明

    千次阅读 2016-12-22 08:36:21
    Java中的transient关键字,从字面意义理解,transient为短暂的意思transient应用于class的field上,即说明该field为短暂的,那对于1个成员变量,短暂的成员变量意味着什么transient 修饰的变量,在类实例的序列...
  • java中的transient关键字

    2021-03-13 17:39:26
    文章目录transient简介使用序列化为什么要用transient关键字?transient的作用transient使用总结使用场景Exteranlizable接口实现序列化 原文: https://blog.csdn.net/u012723673/article/details/80699029 transient...
  • @transient 注解注解,什么意思

    万次阅读 2016-11-25 09:52:21
    实体类中使用了@Table注解后,想要添加表中不存在字段,就要使用@Transient这个注解了。在网上找的方法是要将这个注解添加到自定义字段的get方法上,这样做了之后程序报错,最后试了将该注解添加到定义该字段的头部...
  • java中的transient

    2012-01-09 17:27:19
    引用 最近一段时间想把集合部分复习下,上午没事情做,读读jdk自带的src,看ArrayList类时...transient关键字是什么意思啊!学java零零散散也有1年了,真是孤陋寡闻啊……  看看下面的例子,一个登陆时,密码与ID
  • 其实也不是什么错误,就一直在delete processing中,就不删除数据。 信息如下: INFO - Hibernate 3.2.5 INFO - hibernate.properties not found INFO - Bytecode provider name : cglib INFO - using JDK ...
  • 1. native簡單講,呼叫其他語言(c,c++之類)做出來的dll做法1.利用java做個介面供其他語言實作(也就是宣告成native)2.用javah產出.h;3.用其他語言實現native方法4.編譯成dll5.... strictfp意思是FP-str...
  • [quote]最近一段时间想把集合部分复习下,上午没事情做,读读jdk自带的src,看...[/code]transient关键字是什么意思啊!学java零零散散也有1年了,真是孤陋寡闻啊…… 看看下面的例子,一个登陆时,密码与ID,密...
  • 1.transient关键字 transient是针对在网络上传输的可以串化的对象(即实现了Serializable接口)来说的。 如果将对象不需要保存的数据声明为... 2.volatile关键字 我们知道,在Java中设置变量值的操作,除了long和dou
  • transient 关键字有什么用途文章分类:Java编程 transient 关键字有什么用途 java有个特点就是序列化,简单地来说就是可以将这个类存储在物理空间(当然还是以文件的形式存在),那么当你从本地还原...
  • 之前在看ArrayList的源码的时候就遇到了这个关键字,不知道它是什么意思,但是那个时候太忙了就跳过了,最近在看LinkedList的时候又遇到了这个关键字,突然想起了,就决心把它整理一下,说实话java里的基础知识还是...
  • 很明显异常的意思是,引用了一个没保存的对象,而我的操作是点修改,即需要根据ID查询实体,那查询为什么会存在保存的操作呢?经仔细排查后得出结论 实体类如下: [code="java"] package ...
  • Serializable & transient

    千次阅读 2009-02-25 15:30:00
    serialize是什么意思? 这个词,在中文中翻译为串行化或者序列化。这两个翻译应该说几乎都无法表达它的实际意义。如果你原本不懂,给你翻译了,你还是不懂。 事实上这是IO存储中的一个概念。计算机中所有的内容都...
  • java笔记

    2015-03-04 11:14:00
    1、java中的关键字transient什么意思 使用transient修饰符来标识一个成员变量在序列化子系统中应被忽略。transient:使用对象:字段介绍:字段不是对象持久状态的一部分,不应该把字段和对象一起串起。在JPA实体中...
  • transient 关键字的用途

    2007-06-23 17:00:00
    序列化是什么意思?java有个特点就是序列化,简单地来说就是可以将这个类存储在物理空间(当然还是以文件的形式存在),那么当你从本地还原这个文件时,你可以将它转换为它本身。这可以极大地方便网络上的一些操作,...
  • 一、native 一个方法被native修饰,那么说明该方法就不属于java体系...英文单词意思是瞬时的、短暂的。一旦某个变量被transient所修饰,就意味着该变量不会被序列化。那么有什么用呢,实现了有选择的序列化!比如在...
  • 02、Java 常用关键字理解1、static1.1 修饰的对象1.2 初始化时机2、final3、try、catch、finally4、volatile5、transient6、default7、面试题7.1 如何证明 static 静态变量和类无关?7.2 常常看见变量和方法被 ...
  • JAVA试题(100道) —————————————————————————————————————— 题目1: 下面不属于基本类型的是:c (选择1项) A) boolean B) long C) String D) byte 题目2:d 如下程序中:...
  • sesvc.exe 阿萨德

    2019-06-02 17:11:12
    看看分别是什么意思? 初始化桶大小,因为底层是数组,所以这是数组默认的大小。 桶最大值。 默认的负载因子(0.75) table 真正存放数据的数组。 Map 存放数量的大小。 桶大小,可在初始化时显式指定。 负载因子,...
  • //不知道什么意思。。。。 public <T> T[] toArray(T[] a) { if (a.length < size){ a = (T[])java.lang.reflect.Array.newInstance(a.getClass().getComponentType(), size); } System....

空空如也

空空如也

1 2
收藏数 26
精华内容 10
关键字:

javatransient什么意思

java 订阅