我们知道将字段设置为transient,可以避免该自动被序列化,但若反序列化时又希望该transient有值怎么办呢?
一种不使用transient的办法是使用Externalizable接口。Serializable接口默认序列化所有字段,而Externalizable接口继承自Serializable,要求实现两个方法readExternal(ObjectInput),writeExternal(ObjectOutput),默认不序列化任何字段,字段需要显式序列化。
显然transient只能和Serializable接口共用,在Serializable类中反序列化时恢复transient的值。可以通过在类中添加
private void readObject(ObjectInputStream ois);
private void writeObject(ObjectOutputStream oos);
两个方法。注:方法必须为private,此方法也非Serializable接口中的方法,但在序列化和反序列化时会自动被调用(很特殊吧)。
完整例子如下
public class TestSerializable {
public static void main(String[] args) {
        String url = "jdbc:oracle:thin:@10.141.245.123:1521:FDU";
        Properties prop = new Properties();
        prop.setProperty("user", "system");
        prop.setProperty("password", "fducs");
        SerialObject serialObj = new SerialObject(url,prop);
        try {
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new java.io.File("SerialObject.out")));
            oos.writeObject(serialObj);
        } catch (IOException ex) {
            Logger.getLogger(TestSerializable.class.getName()).log(Level.SEVERE, null, ex);
        }
        System.out.println("SerialObject original:\n"+ serialObj);
SerialObject backObj = null;
        try {
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new java.io.File("SerialObject.out")));
            backObj = (SerialObject) ois.readObject();
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(TestSerializable.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(TestSerializable.class.getName()).log(Level.SEVERE, null, ex);
        }
System.out.println("SerialObject target:\n"+ backObj);
}
}
class SerialObject implements java.io.Serializable {
private String url;
    private Properties prop;
    private transient Connection con;
public SerialObject(String url, Properties prop) {
        this.url = url;
        this.prop = prop;
        con = getConnection(url, prop);
    }
private Connection getConnection(String url, Properties prop) {
        Connection connect = null;
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            connect = DriverManager.getConnection(url, prop);
        } catch (SQLException ex) {
            Logger.getLogger(TestSerializable.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(TestSerializable.class.getName()).log(Level.SEVERE, null, ex);
        }
        return connect;
    }
@Override
    public String toString(){
        StringBuffer sbuf = new StringBuffer();
        sbuf.append("URL="+url);
        sbuf.append("\n");
        sbuf.append("Properties="+prop);
        sbuf.append("\n");
        sbuf.append("Connection="+con);
        return sbuf.toString();
    }
private void readObject(ObjectInputStream ois){
        try {
            ois.defaultReadObject();
            System.out.println("url="+url);
            System.out.println("prop="+prop);
            con = getConnection(url,prop);
        } catch (IOException ex) {
            Logger.getLogger(SerialObject.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(SerialObject.class.getName()).log(Level.SEVERE, null, ex);
        }
}
private void writeObject(ObjectOutputStream oos){
        try {
            oos.defaultWriteObject();
        } catch (IOException ex) {
            Logger.getLogger(SerialObject.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

转载于:https://blog.51cto.com/dongdong1314/312615

反序列化时恢复transient字段相关推荐

  1. mysql字段掩码_在必须输入字母A~Z或数字0~9数据库中设计表时,如果将字段的输入掩码设置为“LLLL”,则该字段能够接受的输入是()_学小易找答案...

    [单选题]关于Access2010的索引,下列叙述中错误的是() [单选题]痰饮淤血() [单选题]关于Access查询中的数据源,下列说法中正确的是 [单选题]对Access2010表中某一个字段建 ...

  2. 查询时注意 查询字段传值参数类型,尽量和数据库字段类型一致

    查询时注意 查询字段传值参数类型,尽量和数据库字段类型一致. 数据量越大查询问题会越严重,到几十万的数据时,类型一致和不一致会是千倍差距 转载于:https://www.cnblogs.com/i60 ...

  3. 使用JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了为 maxJsonLength属性...

    使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错.字符串的长度超过了为 maxJsonLength 属性设置的值. 解决办法是在web.config增加如下节点到& ...

  4. tensorflow tf.train.Saver.restore() (用于下次训练时恢复模型)

    # 保存当前的Session到文件目录tf.train.Saver().save(sess, 'net/my_net.ckpt') # 然后在下次训练时恢复模型: tf.train.Saver().r ...

  5. layui单元格鼠标样式_Layui实现数据表格中鼠标悬浮图片放大效果,离开时恢复原图的方法...

    如下所示: var tableIns = window.demoTable = table .render({ elem : '#idTest', id : 'idTest', url : '/par ...

  6. 调用webservice时提示对操作的回复消息正文进行反序列化时出错

    主要原因webservice返回值的长度超过readerQuotas中的了maxStringContentLength值,造成返回值截断,不完整,反序列化时出错. <readerQuotas m ...

  7. Visio 2007中进行数据库建模时如何显示字段类型以及概念名称

    关于在VISIO中进行数据库建模时如何显示字段类型,以及注释的 1 如何显示字段类型:   在visio菜单上--->点击数据库--->选项--->文档    打开后选择表这项,在上 ...

  8. MySQL数据库建表时对于某个字段设置了默认值,但是使用Spring Data Jpa的save后默认值没有生效

    问题描述:MySQL数据库建表时对于某个字段设置了默认值,但是使用Spring Data Jpa的save后默认值没有生效.MySQL数据库中构建的用户表表结构如下所示: DROP TABLE IF ...

  9. Can not perform this action after onSaveInstanceState和重建Activity时恢复缓存的Fragmen的问题

    Fragment 在显示或者隐藏,移除是出现Can not perform this action after onSaveInstanceState  #解决办法:onSaveInstanceSta ...

最新文章

  1. java冒泡排序_Java中的经典算法之冒泡排序(Bubble Sort)
  2. boost::bind的使用
  3. windows server服务器上部署java+tomcat网站域名配置
  4. hdu3336 KMP + DP 前缀数组出现的次数
  5. CSS图片廊实例详解
  6. 一阶rc电路时间常数_波形产生电路中的RC在电路中的作用是什么
  7. Unity3D面试ABC
  8. python中列表字典和字符串的相互转化
  9. Spring-扫描/jar/读取Classpath下的文件资源
  10. 【渝粤教育】电大中专学前儿童社会教育 (2)作业 题库
  11. 论Webstorm汉化后无法打开配置
  12. linux安装酷q机器人,【折腾】在Docker中运行酷Q机器人
  13. 三国群英传服务器维护是几点,20191112维护公告
  14. 微信视频号下载短视频的步骤
  15. 从C到C++衔接——浅析两种语言的差别
  16. 【2022】合肥市市赛冲刺【小学组】
  17. 微信小程序 - Vant weapp UI 框架环境搭建详细教程(Window)
  18. centos测试主机网络极限速度
  19. 毕业设计 - 基于java web的在线考试系统【源码+论文】
  20. 为什么我爱Golang

热门文章

  1. 对atexit函数的理解
  2. 01-06 Linux常用命令-统计
  3. mysql user表字段详解_Mysql User表权限字段说明全介绍
  4. 利用指针数组计算2个3行4列矩阵的和_[剑指 Offer] 04. 二维数组中的查找
  5. php 中文key_API常用签名验证方法(PHP实现)
  6. java连接weblogic数据源_使用weblogic数据源大全
  7. python老师好的长度_abc和老师好的长度都是3。( )
  8. 冷热水龙头_冷热水龙头结构图 冷热水龙头怎么拆
  9. linux安装ftp后账号密码设置,CentOS 建立ftp账号(vsftpd运用安装与配置疑问 )
  10. Ajax请求成功后页面跳转