精华内容
下载资源
问答
  • transient”——“瞬态”,先不说这个翻译是否恰当,这个变量关键字一直不曾使用,简单的说就是被瞬态定义的变量不可序列号。或者这么给他换个名字——“不可序列化状态”。打个比方,如果一个用户有一些敏感信息...

    “transient”——“瞬态”,先不说这个翻译是否恰当,这个变量关键字一直不曾使用,简单的说就是被瞬态定义的变量不可序列号。或者这么给他换个名字——“不可序列化状态”。

    打个比方,如果一个用户有一些敏感信息(譬如密码,银行卡号等),为了安全起见,不希望在网络操作(主要涉及到序列化操作,本地序列化缓存也适用)中被传输。这些信息对应的变量就可以被定义为transient类型。换句话说,这个字段的生命周期仅存于调用者的内存中。

    如定义类:

    public class People implements Serializable {

    private static final long serialVersionUID = 8294180014912103005L;

    /**

    * 用户名

    */

    private String username;

    /**

    * 密码

    */

    private transient String password;

    }

    密码字段为transient,这时候如果对该对象进行序列化,这个密码字段是不会被保存的。

    以下例子展示了这个行为:

    public static void main(String[] args) throws Exception {

    People p = new People();

    p.setUsername("snowolf");

    p.setPassword("123456");

    System.err.println("------操作前------");

    System.err.println("username: " + p.getUsername());

    System.err.println("password: " + p.getPassword());

    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(

    "people.txt"));

    oos.writeObject(p);

    oos.flush();

    oos.close();

    ObjectInputStream ois = new ObjectInputStream(new FileInputStream(

    "people.txt"));

    p = (People) ois.readObject();

    ois.close();

    System.err.println("------操作后------");

    System.err.println("username: " + p.getUsername());

    System.err.println("password: " + p.getPassword());

    }

    执行结果是:

    ------操作前------

    username: snowolf

    password: 123456

    ------操作后------

    username: snowolf

    password: null

    展开全文
  • 1、transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。2、被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。3、...

    1、transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。2、被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。3、一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。也可以认为在将持久化的对象反序列化后,被transient修饰的变量将按照普通类成员变量一样被初始化。如下面的例子package com.kkoolerter;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;import java.util.Date;public class Main implements Serializable {private static final long serialVersionUID = -5836283489677344417L;private transient int classValue = 10;private transient Date date = new Date();private transient static int staticValue = 10;public static void main(String[] args) throws Exception {Main m = new Main();m.classValue = 11;Main.staticValue = 11;ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(new File("0xjh000")));out.writeObject(m);out.close();ObjectInputStream in = new ObjectInputStream(new FileInputStream(new File("0xjh000")));Main m1 = (Main) in.readObject();in.close();System.out.println(m1.classValue);System.out.println((m1.date == null ? "date is null": "date is not null"));}}程序将输出:0date is null这就说明了一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。思考一下下面的例子:package com.kkoolerter;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关键字修饰";@Overridepublic void writeExternal(ObjectOutput out) throws IOException {out.writeObject(content);}@Overridepublic 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("ext0000")));out.writeObject(et);ObjectInput in = new ObjectInputStream(new FileInputStream(new File("ext0000")));ExternalizableTest et1 = (ExternalizableTest) in.readObject();System.out.println(et1.content);out.close();in.close();}}程序运行后将输出如下结果:哈哈~我将会被序列化,不管我是是否被transient关键字修饰这是为什么呢,不是说类的变量被transient关键字修饰以后将不能序列化了吗?我们知道在Java中,对象的序列化可以通过实现两种接口来实现,若操作的是一个Serializable对象,则所有的序列化将会自动进行,若操作的是 一个Externalizable对象,则没有任何东西可以自动序列化,需要在writeExternal方法中进行手工指定所要序列化的变量,这与是否被transient修饰无关。因此第二个例子输出的是变量content初始化的内容,而不是null。

    展开全文
  • Possible Duplicate:what does the keyword"transient" means in java?号我在Java中阅读了关于EDCOX1×0的关键字。我理解的是什么?它被用于田野。如果声明transient关键字,该字段将不会序列化。可序列化何时发生在...

    本问题已经有最佳答案,请猛点这里访问。

    Possible Duplicate:

    what does the keyword"transient" means in java?

    我在Java中阅读了关于EDCOX1×0的关键字。我理解的是什么?它被用于田野。如果声明transient关键字,该字段将不会序列化。可序列化何时发生在Java的字段中?.如果不扩展Serializable接口,会发生什么情况?如果我说错了请纠正我。这个问题可能是重复的。

    坎南

    因此,您不必搜索,只需添加免责声明"此问题可能重复。"

    他知道术语瞬态,但他想再次确认"如果类不扩展可序列化,那么瞬态就没有任何意义"。这一事实在任何地方都没有明确提及。+ 1

    我在Java中搜索了瞬态,并阅读了关于StAcExpLoad中的瞬态问题。对不起,我看完后不清楚。

    @我就是这么说的,支持你的问题,甚至反对它。

    您可以将其用于要从序列化中排除的字段。序列化仅适用于类层次结构中的类或类实现接口的类。例如,java.lang.Throwable实现java.io.Serializable,因此所有错误和异常都继承该标记接口。

    当您希望将对象从Java堆转移到平面文件或网络上时,需要进行序列化;基本上,每当对象需要从JVM中取出时,都需要以某种方式存储,以便可以重新创建。

    因此,如果在序列化之后再次创建对象时,您认为不需要填充任何变量,那么您可以将其声明为瞬态变量。例如物体上的温度。我们知道,如果我们以任何方式重新创建对象,那么当前的温度没有任何意义,那么为什么要在序列化过程中对其进行序列化。

    只有在我扩展Serializable时才需要,对吗?。用于将对象存储在文件或网络中供以后使用。

    @是的,你是对的。

    序列化对象时,使用ObjectOutputStream来"写下来",使用ObjectInputStream来"读回来"。

    通常,Java实现的默认行为对于串行化的许多"常用"来说是足够好的。transient关键字告诉JVM您不希望它保存(或恢复)变量的值。在处理transient变量时应该格外小心:在还原序列化实例之后,这些变量可能为空或具有不一致的值。最好将添加到可序列化类中

    private void writeObject(java.io.ObjectOutputStream out) throws IOException{

    out.defaultWriteObject();

    }

    private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException{

    in.defaultReadObject();

    //here do something to re-initialize transient variables

    }

    通过这种方式,您可以为所有声明的瞬态插入一个特殊的处理。(请记住,只有在第一次使用可序列化类的构造函数时才调用它,而不是在从ObjectInputStream中读取对象时调用它)

    在任何其他不涉及序列化的上下文中,transient并不意味着什么。

    展开全文
  • private transient Object[] elementData; private int size; ArryList初始化时,elementData数组大小默认为10; 每次add()时,先调用ensureCapacity()保证数组不会溢出,如果此时已满,会扩展为数组length...

    1、ArrayList是基于数组实现的,其构造函数为:

    private transient Object[] elementData;

    private int size;

     

    ArryList初始化时,elementData数组大小默认为10;

    每次add()时,先调用ensureCapacity()保证数组不会溢出,如果此时已满,会扩展为数组length的1.5倍+1,然后用array.copy的方法,将原数组拷贝到新的数组中;

    ArrayList线程不安全,Vector方法是同步的,线程安全;

     

    2、LinkedList是基于双链表实现的:

    Object element;

    Entry next,previous;

     

    初始化时,有个header Entry,值为null;

    使用header的优点是:在任何一个条目(包括第一个和最后一个)都有一个前置条目和一个后置条目,因此在LinkedList对象的开始或者末尾进行插入操作没有特殊的地方;

     

    使用场景:

    1. 如果应用程序对各个索引位置的元素进行大量的存取或删除操作,ArrayList对象要远优于LinkedList对象;
    2. 如果应用程序主要是对列表进行循环,并且循环时候进行插入或者删除操作,LinkedList对象要远优于ArrayList对象;

     

    展开全文
  • 使用场景: (1)如果应用程序对各个索引位置的元素进行大量的存取或删除操作,ArrayList对象要远优于LinkedList对象; ( 2 ) 如果应用程序主要是对列表进行循环,并且循环时候进行插入或者删除操作,...
  • transient与序列化

    千次阅读 2016-02-22 23:00:52
    transient的作用:修饰实力域,使其从一个类的默认序列化形式中省略(即默认序列化方式不对该字段做写与读 存取操作)应用场景:业务需要,不宜做序列化如银行密码等 信息不希望在网络和磁盘等地方存储,所以可以用...
  • 2、应用场景 (1)一些安全性的信息,比如密码,一般情况下是不能离开JVM的,不能被序列化。 (2)类中的字段值可以根据其它字段推导出来,如一个长方形类有三个属性长度、宽度、面积,面积不需要序列化。 ...
  • 一、应用场景 如果一个用户有一些敏感信息(如密码,银行卡号等),为了安全起见,不希望在网络操作(主要涉及到序列化操作,本地序列化缓存也适用)中被传输,这些信息对应的变量就可以加上transient关键字。...
  • 应用场景1:Serializablejava 可以使用 Serializable接口来实现对象的可序列化,并且可以使用IO流对其进行操作。 在实现Serializable接口之后,默认是序列化所有的属性,但是有时有些信息,我们不想其被序列化,...
  • java 序列化 serialVersionUID transient

    千次阅读 2015-11-19 22:31:23
    为什么要序列化?...序列化的应用场景 1、对象保存到硬盘上, 2、对象在远程对象调用(RMI)中传输 3、分布式系统中,比如memcached分布式缓存系统中,缓存的key和value都必须序列化 实现序列化的方法
  • 1.Java对象序列化的应用场景 将对象保存至文件 将对象保存至数据库 服务之间传输对象 2.所用类 ObjectOutputStream 、ObjectInputStream File file = new File("D:/test.txt"); Student stude...
  • 1、CopyOnWriteArrayList... 底层是一个可变数组 private transient volatile Object[] array ; 读的时候不用加锁,写加锁 public void add(int index, E element) { final ReentrantLock lock = l.lock; ...
  • 应用场景:一是实现pojo对象的读写操作,将每个对象转换为字节流,而这些字节流可以被持久化到设备上,再次读取时会将字节流还原成对象。当我们希望某些数据能在程序停止运行后,还能继续存在。在程序再次执行时...
  •  网上随便一搜,能搜出一大堆对三者进行区别分析的文章,但是呢,理论是一回事,实际使用又是另外一回事,到底在何种场景下应该使用何种注入方式呢?    通过这篇文章和我自身的实际经验,来说一说实际应用中的...
  • 序列化知识点总结

    2019-09-08 00:29:00
    应用场景2.如何声明一个可序列化的类?3.serialVersionUID4.transient 与 static、transient 与 final5.序列化机制6.定制序列化规则 1.应用场景 2.如何声明一个可序列化的类? 一个类可序列化的前提:实现...
  • 普遍应用在网络传输、RMI等场景中。本文通过分析ArrayList的序列化来介绍Java序列化的相关内容。主要涉及到以下几个问题: 怎么实现Java的序列化 为什么实现了java.io.Serializable接口才能被序列化 transient的...
  • 普遍应用在网络传输、RMI等场景中。本文通过分析ArrayList的序列化来介绍Java序列化的相关内容。主要涉及到以下几个问题: 怎么实现Java的序列化 为什么实现了java.io.Serializable接口才能被序列化 ...
  • 序列化的应用场景: 数据在网络上传输也需要序列化; 对象存储到本地磁盘上需要序列化; transient:序列化中使用的关键字 被transient修饰的属性不进行序列化,反序列化时基本类型初始化为0,其它类型初始化为null...
  • 序列化和反序列化

    2019-04-10 09:40:03
    应用场景 传输数据包括磁盘或者数据库中或者网络通信中 如何序列化 JAVA中继承Serializable,就可以被序列化 public class User implements Serializable{ private int age; private String name; //序列化会...
  • 源码分析二:LinkedList

    2018-09-18 13:39:23
    应用场景 工作经验 一、分析 环境:JDK1.8 LinkedList 双向链表,支持null元素 二、变量 /** * 不被序列化的大小 */ transient int size = 0; /** * 指向第一个元素节点 */ transient Node<E&...
  • 自定义序列化的应用 场景1. 序列化时不包含某个字段,如密码,但反序列化时却需要该字段。此时不能使用transient修饰字段,因其序列化/反序列化时都会排除其修饰的属性。 场景2. 其他特殊场景 使用方式 自定义...
  • java中Serializable与Parcelable的使用

    千次阅读 2017-09-08 15:58:20
    以及用transient关键字修饰的变量(transient是禁止序列化的标识,效果等同于static修饰的变量).java反序列化:是与java序列化相对的,表示从磁盘或者其他介质中读取序列化对象的内容.java序列化的应用场景: 内存中的...
  • Android序列化

    2020-08-11 16:07:17
    应用场景 1.网络传输 2.进程间通讯(进程间传递数据) 3.intent传输数据 序列化方案 Serializable 空接口,起到标识作用,最简单的序列化方式 serialVersionUID:控制版本,什么场景加?什么场景不加? readResolve等...
  • 我们都知道CopyOnWriteArrayList是线程安全的列表,其内部是数组结构,并且适用于读多写少的应用场景。当写比较频繁时不要使用CopyOnWriteArrayList,应该使用其他的数据结构代替。接下来就从源码角度分析一下为什么...
  • 我们都知道CopyOnWriteArrayList是线程安全的列表,其内部是数组结构,并且适用于读多写少的应用场景。当写比较频繁时不要使用CopyOnWriteArrayList,应该使用其他的数据结构代替。接下来就从源码角度分析一下为什么...
  • Java 序列化 java 序列化是指把对象转化成字节的过程 注意:如果有的字段是...应用场景 java 序列化一般需要类实现接口Serializable 序列化之后就可以用IO流进行数据交互,具体情况要根据自己的业务去分析...
  • 2、序列化的应用场景 当你想把的内存中的对象状态保存到一个文件中或者数据库中时候; 当你想用套接字在网络上传送对象的时候; 当你想通过RMI传输对象的时候 拓展: transient关键字 将不需要序列化的属性前添加...

空空如也

空空如也

1 2 3 4 5
收藏数 83
精华内容 33
关键字:

transient应用场景