当前位置: 首页 > news >正文

资阳住房和城乡建设厅网站陕西省建设工程招投标信息网官网

资阳住房和城乡建设厅网站,陕西省建设工程招投标信息网官网,南昌百恒信息技术有限公司,提供东莞网站建设价格转载自 Java transient关键字使用小记1. transient的作用及使用方法我们都知道一个对象只要实现了Serilizable接口#xff0c;这个对象就可以被序列化#xff0c;java的这种序列化模式为开发者提供了很多便利#xff0c;我们可以不必关系具体序列化的过程#xff0c;只要…转载自   Java transient关键字使用小记1. transient的作用及使用方法我们都知道一个对象只要实现了Serilizable接口这个对象就可以被序列化java的这种序列化模式为开发者提供了很多便利我们可以不必关系具体序列化的过程只要这个类实现了Serilizable接口这个类的所有属性和方法都会自动序列化。然而在实际开发过程中我们常常会遇到这样的问题这个类的有些属性需要序列化而其他属性不需要被序列化打个比方如果一个用户有一些敏感信息如密码银行卡号等为了安全起见不希望在网络操作主要涉及到序列化操作本地序列化缓存也适用中被传输这些信息对应的变量就可以加上transient关键字。换句话说这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化。总之java 的transient关键字为我们提供了便利你只需要实现Serilizable接口将不需要序列化的属性前添加关键字transient序列化对象的时候这个属性就不会序列化到指定的目的地中。示例code如下 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;/*** description 使用transient关键字不序列化某个变量* 注意读取的时候读取数据的顺序一定要和存放数据的顺序保持一致* * author Alexia* date 2013-10-15*/ public class TransientTest {public static void main(String[] args) {User user new User();user.setUsername(Alexia);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 {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; 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: Alexia password: 123456read after Serializable: username: Alexia password: null密码字段为null说明反序列化时根本没有从文件中获取到信息。 2. transient使用小结 1一旦变量被transient修饰变量将不再是对象持久化的一部分该变量内容在序列化后无法获得访问。 2transient关键字只能修饰变量而不能修饰方法和类。注意本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量则该类需要实现Serializable接口。 3被transient关键字修饰的变量不再能被序列化一个静态变量不管是否被transient修饰均不能被序列化。 第三点可能有些人很迷惑因为发现在User类中的username字段前加上static关键字后程序运行结果依然不变即static类型的username也读出来为“Alexia”了这不与第三点说的矛盾吗实际上是这样的第三点确实没错一个静态变量不管是否被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;/*** description 使用transient关键字不序列化某个变量* 注意读取的时候读取数据的顺序一定要和存放数据的顺序保持一致* * author Alexia* date 2013-10-15*/ public class TransientTest {public static void main(String[] args) {User user new User();user.setUsername(Alexia);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 jmwang;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: Alexia password: 123456read after Serializable: username: jmwang password: null这说明反序列化后类中static型变量username的值为当前JVM中对应static变量的值为修改后jmwang而不是序列化时的值Alexia。 3. transient使用细节——被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;/*** descripiton Externalizable接口的使用* * author Alexia* date 2013-10-15**/ 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(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();} }content变量会被序列化吗好吧我把答案都输出来了是的运行结果就是 是的我将会被序列化不管我是否被transient关键字修饰这是为什么呢不是说类的变量被transient关键字修饰以后将不能序列化了吗我们知道在Java中对象的序列化可以通过实现两种接口来实现若实现的是Serializable接口则所有的序列化将会自动进行若实现的是Externalizable接口则没有任何东西可以自动序列化需要在writeExternal方法中进行手工指定所要序列化的变量这与是否被transient修饰无关。因此第二个例子输出的是变量content初始化的内容而不是null。
http://wiki.neutronadmin.com/news/365368/

相关文章:

  • 企业网站颜色选择备案域名回收
  • 昭通网站建设公司做企业网站软件
  • 手机酒店网站建设dz论坛网站建设
  • 贵州高端网站建设wordpress自动插件下载
  • 网站建设费用皆选网络wordpress离线发布
  • 网站开发外包费用北京做网站的好公司
  • 电商网站订货msn网站制作
  • linux下载wordpress网站建设和网站优化哪个更重要
  • 上海网站开发哪里好薇工作简历模板
  • 怎样安装网站模板免费的企业网站建设
  • 深圳外贸商城网站建设制作网站的平台
  • vi设计网站排行榜商城网站服务器
  • 网站模板用什么打开温州网站制作推广
  • 移动网站建设论文室内设计平面图软件
  • 四川建设局网站首页国内做网站制作比较
  • 襄阳市建设局网站插画师零基础自学
  • 旅游网站建设经费预算优化wordpress调用文章函数
  • 怎么在网站标头做图标企业seo网站营销推广
  • 会宁网站建设公司wordpress.org移除
  • 百度站长怎么做网站维护windows7优化大师官方下载
  • 网站开发人力成本wordpress cas
  • 快速建设企业网站公益机构网站建设方案
  • 乐清网站建设做网站799元没有经验可以做新媒体运营吗
  • 软件开发培训南京百度提升优化
  • 如何备份织梦系统做的网站网络营销推广策略
  • 找人做彩票网站有哪些做网站公司找哪家
  • 西安做网站哪家便宜蚌埠市建设学校网站
  • 做公司网站哪个好杭州市江干建设局网站
  • 银川住房和城乡建设局网站网站个人中心wordpress
  • 物流管理网站建设域名解析ip138在线查询