序列化:内存中的Java对象<——>二进制流
目的:a)有时候需要把对象存储到外部存储器中持久化保存,b)还有时候,需要把对象通过网络传输。

可序列化的对象,Java要求可序列化的类实现下面两个接口之一。
——Serializable:接口只是一个标记性的接口,实现该接口无需实现任何方法;——Externalizable实现该接口需要实现方法。

序列化的IO流:
ObjectInputStream ——负责从二进制流“恢复”对象-->从文件中提取对象;ObjectOutputStream ——负责将内存中的对象写入磁盘

举例说明1(注意:一定要实现Serializable接口):

public class Test {public static void main(String[] args) {Apple apple = new Apple("Xx苹果", "红色", 2.3);// System.out.println(apple);// 这里利用了JDK7里面的try()自动关闭资源,好处是不用手动关闭oostry (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("f:/1.txt"));) {oos.writeObject(apple);} catch (IOException e) {e.printStackTrace();}}
}class Apple implements Serializable {private String name;private String color;private double weight;public Apple() {}public Apple(String name, String color, double weight) {this.name = name;this.color = color;this.weight = weight;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getColor() {return color;}public void setColor(String color) {this.color = color;}public double getWeight() {return weight;}public void setWeight(double weight) {this.weight = weight;}@Overridepublic String toString() {return "Apple [color=" + color + ", name=" + name + ", weight="+ weight + "]";}
}

而读取文件中的对象就更简单了(下面省略了上面的Apple类):

public class Test {public static void main(String[] args) {try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("f:/1.txt"));) {System.out.println(ois.readObject().toString());} catch (ClassNotFoundException | IOException e) {e.printStackTrace();
}}}

引用变量的序列化机制:
A。引用变量所引用的对象的所有属性都应该是可序列化的。
B。如果要序列化的对象是之前已经序列化的,此时系统序列化一个编号。

这种序列化机制,就是为了保存磁盘里的二进制流与内存中的对象是对应的。transient:用于修饰实例成员变量(不能与static修饰符同时使用)。--用于指定被修饰的field不会被序列化。好处:比如银行卡账号、密码就不应该被序列化出来。【注意】由于static修饰的类变量存储在类信息中,并不存储在对象里,所以有static修饰的类变量不能被序列化。

自定义序列化类:

/*** @author lhy* @description 自定义序列化类*/
class User implements Serializable {private static final long serialVersionUID = 546525067577254190L;private String account;private String password;public User() {}public User(String account, String password) {this.account = account;this.password = password;}public String getAccount() {return account;}public void setAccount(String account) {this.account = account;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "User [account=" + account + ", password=" + password + "]";}// 下面两个方法,提供给系统调用,系统会调用者两个方法完成实际的序列化private void writeObject(ObjectOutputStream out) throws IOException {// 序列化User的两个属性out.writeUTF(account);out.writeUTF(new StringBuilder(password).reverse().toString());}private void readObject(ObjectInputStream in) throws IOException,ClassNotFoundException {account = in.readUTF();password = new StringBuilder(in.readUTF()).reverse().toString();}}public class Test {public static void main(String[] args) {User user = new User("张三", "123");ObjectOutputStream oos = null;try {oos = new ObjectOutputStream(new FileOutputStream("f:/1.txt"));oos.writeObject(user);} catch (IOException e) {e.printStackTrace();} finally {try {oos.close();} catch (Exception e2) {e2.printStackTrace();}}}
}

读取文件中的对象:

public class Test {public static void main(String[] args) {ObjectInputStream ois = null;try {ois = new ObjectInputStream(new FileInputStream("f:/1.txt"));User user = (User)ois.readObject();System.out.println(user.toString());} catch (Exception e) {e.printStackTrace();} finally {try {ois.close();} catch (Exception e2) {e2.printStackTrace();}}}
}

运行一下,我们可以看到输出:User [account=张三, password=123]

自定义(稳定)序列化:可以借助于“定制序列化”对属性进行一些“加密”。

版本号】当我们的类经常使用时,有时候系统无法确定“发序列化”是的class文件是否还正确。--建议显式为“可序列化”指定一个版本号。--因为系统默认的版本号不稳定(经常改变)。serialver.exe -专门用来查看类的版本号。用法:serialver 序列化的类。--当我们修改了类时,记得要修改版本号。

结束语:

有关Java中的序列化今天就讲到这里,明天开始学习Java面向对象之界面编程。

Java学习系列(十二)Java面向对象之序列化机制及版本相关推荐

  1. Java学习系列(十八)Java面向对象之基于UDP协议的网络通信

    UDP协议:无需建立虚拟链路,协议是不可靠的. A节点以DatagramSocket发送数据包,数据报携带数据,数据报上还有目的目地地址,大部分情况下,数据报可以抵达:但有些情况下,数据报可能会丢失 ...

  2. Java学习系列(十六)Java面向对象之基于TCP协议的网络通信

    TCP/IP的网络分层模型:应用层(HTTP/FTP/SMTP/POPS...),传输层(TCP协议),网络层(IP协议,负责为网络上节点分配唯一标识),物理层+数据链路层). IP地址用于标识网络中 ...

  3. Java学习系列(十九)Java面向对象之数据库编程

    JDBC(Java Data Base Connectivity:java数据库连接):它定义了一组标准的操作数据库的接口,既然是接口,那它就是一种规范,是Java操作数据库的技术规范. Java数据 ...

  4. Java学习系列(十五)Java面向对象之细谈线程、线程通信(下)

    竞争资源(共享资源):如果有多条线程需要并发访问.并修改某个对象,该对象就是"竞争资源".为了避免多个线程"自由竞争"修改共享资源所导致的不安全问题. 线程同步 ...

  5. Java学习系列(十四)Java面向对象之细谈线程、线程通信(上)

    线程与进程的关系: 进程 --运行中的程序.进程有如下特征: 1).独立性.拥有自己的资源,拥有自己独立的内存区. 通常来说,一个进程的内存空间,是不允许其他进程访问的. 但像Windows,如A进程 ...

  6. Java学习系列(十)Java面向对象之I/O流(上)

    IO流 我们知道应用程序运行时数据是保存在内存中的,但由于内存中的数据不可持久保存(如断电或程序退出时数据会丢失),因此需要一种手段将数据写入硬盘或读入内存.面向IO流编程就是一种很好的选择.IO:I ...

  7. java se系列(十二)集合

    1.集合 1.1.什么是集合 存储对象的容器,面向对象语言对事物的体现,都是以对象的形式来体现的,所以为了方便对多个对象的操作,存储对象,集合是存储对象最常用的一种方式.集合的出现就是为了持有对象.集 ...

  8. 反射、Lambda表达式(Java学习笔记十二)

    文章目录 反射 Class 类 创建运行时类的对象 获取运行时类的完整结构 调用运行时类的指定结构 调用指定方法 调用指定属性 关于setAccessible方法的使用: 动态代理 Lambda表达式 ...

  9. java 二叉树的高度_吃透Java集合系列十二:TreeMap

    一:TreeMap整体认识 我们知道HashMap,它保证了以O(1)的时间复杂度进行增.删.改.查,从存储角度考虑,这两种数据结构是非常优秀的.但是HashMap还是有自己的局限性----**它不具 ...

最新文章

  1. AAAI2020-图神经网络(GNN)过去、现在、应用和未来最新研究进展分享
  2. 解决mac上mariadb不能远程访问的问题
  3. 我的第一个Python程序
  4. postgresql在线备份与恢复(三)
  5. 倒数日怎么显示在桌面_深圳暴风谷滑梯皮带提升机怎么选
  6. DBD::mysql::db do failed: Table cl_access was locked with a READ lock and can't be updated
  7. 如何在Cloud for Customer overview UI上扩展新的按钮
  8. 【HDU - 2066】:一个人的旅行(Dijkstra算法)
  9. python获取当前线程_Python爬虫(线程,进程)
  10. 关于MPMoviePlayerController类播放视频时,外放没有声音的问题(ios)
  11. WPF的错误以及笔记
  12. 关系数据库的三大范式以及BCNF范式
  13. 激光雷达+imu_激光雷达slam-激光点云畸变补偿
  14. 江民KV2008离线包和安装包下载 2007-12-24
  15. Android Native 代码 Release 编译 - 隐藏符号表
  16. MYSQL使用MHA实现主从复制高可用、Galera Cluster介绍、压力测试、my.cnf配置参考
  17. springcloud springboot nacos版本对应
  18. linux服务被植入挖矿(2t3ik与ddgs)解决方式
  19. UOJ147 斗地主
  20. oracle通过值查字段,Oracle 中 根据值 查询 所在 表和字段

热门文章

  1. Python 用Django创建自己的博客(2)
  2. window下查看WebLogic mbean
  3. 烂泥:使用snmpwalk采集设备的OID信息
  4. Python的系统管理_08_python_异常处理
  5. 5分钟部署一个Hello World Servlet到CloudFoundry 1
  6. 在MyEclipse(2015)中上传项目到github的步骤(很详细)
  7. Azure HDInsight与Hadoop周边系统集成
  8. D-LINK二层交换机Asymmetric VLAN配置
  9. 医药吧网API接口开放
  10. Android,已知应用名称, 通过应用名称来启动应用