java serializable用法_java基础----gt;Serializable的使用

news/2024/7/8 11:33:51

Serializable序列化的简要说明

一、 持久化的简单介绍:

“持久化”意味着对象的“生存时间”并不取决于程序是否正在执行——它存在或“生存”于程序的每一次调用之间。通过序列化一个对象,将其写入磁盘,以后在程序再次调用时重新恢复那个对象,就能圆满实现一种“持久”效果。

二、 语言里增加了对象序列化的概念后,可提供对两种主要特性的支持:

远程方法调用(RMI)使本来存在于其他机器的对象可以表现出好象就在本地机器上的行为。将消息发给远程对象时,需要通过对象序列化来传输参数和返回值。

使用一个Java Bean 时,它的状态信息通常在设计期间配置好。程序启动以后,这种状态信息必须保存下来,以便程序启动以后恢复;具体工作由对象序列化完成。

三、 Serializable的一些说明:

对象的序列化处理非常简单,只需对象实现了Serializable 接口即可(该接口仅是一个标记,没有方法)

序列化的对象包括基本数据类型,所有集合类以及其他许多东西,还有Class 对象

对象序列化不仅保存了对象的“全景图”,而且能追踪对象内包含的所有句柄并保存那些对象;接着又能对每个对象内包含的句柄进行追踪

使用transient关键字修饰的的变量,在序列化对象的过程中,该属性不会被序列化。

四、 序列化的步骤:

首先要创建某些OutputStream对象:OutputStream outputStream = new FileOutputStream("output.txt")

将其封装到ObjectOutputStream对象内:ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);

此后只需调用writeObject()即可完成对象的序列化,并将其发送给OutputStream:objectOutputStream.writeObject(Object);

最后不要忘记关闭资源:objectOutputStream.close(), outputStream .close();

五、 反序列化的步骤:

首先要创建某些OutputStream对象:InputStream inputStream= new FileInputStream("output.txt")

将其封装到ObjectInputStream对象内:ObjectInputStream objectInputStream= new ObjectInputStream(inputStream);

此后只需调用writeObject()即可完成对象的反序列化:objectInputStream.readObject();

最后不要忘记关闭资源:objectInputStream.close(),inputStream.close();

Serializable序列化的代码实例

项目结构如下,源代码下载见huhx友情链接:

1qGHRP6xmEYAAAAASUVORK5CYII=

一、 首先我们建立一个Man类,实现了Serializable接口,用于Person类的测试:

1 packagecom.huhx.model;2 importjava.io.Serializable;3

4 public class Man implementsSerializable {5 private static final long serialVersionUID = 1L;6

7 privateString username;8 privateString password;9

10 publicMan(String username, String password) {11 this.username =username;12 this.password =password;13 }14

15 publicString getUsername() {16 returnusername;17 }18

19 public voidsetUsername(String username) {20 this.username =username;21 }22

23 publicString getPassword() {24 returnpassword;25 }26

27 public voidsetPassword(String password) {28 this.password =password;29 }30 }

二、 我们再建立一个Person类,用于序列化:

1 packagecom.huhx.model;2 importjava.io.Serializable;3

4 public class Person implementsSerializable {5 private static final long serialVersionUID = 1L;6

7 privateMan man;8 privateString username;9 private transient intage;10

11 publicPerson() {12 System.out.println("person constru");13 }14

15 public Person(Man man, String username, intage) {16 this.man =man;17 this.username =username;18 this.age =age;19 }20

21 publicMan getMan() {22 returnman;23 }24 public voidsetMan(Man man) {25 this.man =man;26 }27 publicString getUsername() {28 returnusername;29 }30 public voidsetUsername(String username) {31 this.username =username;32 }33 public intgetAge() {34 returnage;35 }36 public void setAge(intage) {37 this.age =age;38 }39 }

三、 编写一个包含main方法的测试类:MainTest,它的writeSerializableObject用于序列化对象:

1 //Serializable:把对象序列化

2 public static voidwriteSerializableObject() {3 try{4 Man man = new Man("huhx", "123456");5 Person person = new Person(man, "刘力", 21);6 ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("output.txt"));7 objectOutputStream.writeObject("string");8 objectOutputStream.writeObject(person);9 objectOutputStream.close();10 } catch(FileNotFoundException e) {11 e.printStackTrace();12 } catch(IOException e) {13 e.printStackTrace();14 }15 }

四、  测试类MainTest,它的readSerializableObject用于反序列化对象:

1 //Serializable:反序列化对象

2 public static voidreadSerializableObject() {3 try{4 ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("output.txt"));5 String string =(String) objectInputStream.readObject();6 Person person =(Person) objectInputStream.readObject();7 objectInputStream.close();8 System.out.println(string + ", age: " + person.getAge() + ", man username: " +person.getMan().getUsername());9 } catch(FileNotFoundException e) {10 e.printStackTrace();11 } catch(Exception e) {12 e.printStackTrace();13 }14 }

五、 在Main方法添加以上两个方法的运行,结果如下:

sqKBsijdi+4AAAAASUVORK5CYII=

在Person类中包含Man的引用,当Person被序列化的时候,从结果可以知道Man也被序列化了

writeObject方法可以传入String,是因为String首先是一个类,其次它也是实现了Serializable接口的

Person类中的age字段是transient,从打印结果可以看到,序列化Person person = new Person(man, "刘力", 21)对象时,age没有进行序列化。如果transient修饰的Object类型的,那么打印的结果将会是null

Externalizable序列化的代码实例

首先我们看一下Externalizable的定义:继承了Serializable

1 public interface Externalizable extends java.io.Serializable

一、 同样的我们先创建一个实现了Externalizable的User类:重写里面两个方法readExternal和writeExternal

1 packagecom.huhx.model;2

3 importjava.io.Externalizable;4 importjava.io.IOException;5 importjava.io.ObjectInput;6 importjava.io.ObjectOutput;7

8 public class User implementsExternalizable {9 privateString user;10

11 publicString getUser() {12 returnuser;13 }14

15 public intgetAge() {16 returnage;17 }18

19 private intage;20

21 publicUser() {22 System.out.println("user constructor.");23 }24

25 public User(String user, intage) {26 System.out.println("user constructor two.");27 this.user =user;28 this.age =age;29 }30

31 @Override32 public void readExternal(ObjectInput in) throwsIOException, ClassNotFoundException {33 System.out.println("read external.");34 user =(String) in.readObject();35 age =in.readInt();36 }37

38 @Override39 public void writeExternal(ObjectOutput out) throwsIOException {40 System.out.println("write external.");41 out.writeObject(user);42 out.writeInt(age);43 }44 }

二、  在MainTest中加入方法writeExternalizableObject,用于序列化对象User

1 //Externalizable的序列化对象

2 public static voidwriteExternalizableObject() {3 User user = new User("huhx", 22);4 try{5 ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("Externalizable.txt"));6 objectOutputStream.writeObject(user);7 objectOutputStream.close();8 } catch(FileNotFoundException e) {9 e.printStackTrace();10 } catch(IOException e) {11 e.printStackTrace();12 }13 }

三、 在MainTest中加入方法writeExternalizableObject,用于反序列化对象User

1 //Externalizable的反序列化对象

2 public static voidreadExternalizableObject() {3 try{4 ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("Externalizable.txt"));5 User user =(User) objectInputStream.readObject();6 objectInputStream.close();7 System.out.println("name: " + user.getUser() + ", age: " +user.getAge());8 } catch(FileNotFoundException e) {9 e.printStackTrace();10 } catch(Exception e) {11 e.printStackTrace();12 }13 }

四、 在Main方法添加以上两个方法的运行,结果如下:

DfhRmr35NkAAAAAElFTkSuQmCC

首先User user = new User("huhx", 22);执行了User的含参构造函数

当执行到writeObject(user);方法时,由于User实现了Externalizable接口,所以它的writeExternal会执行,

在User中的readExternal方法中调用了ObjectInput的readObject方法,在这个方法中通过反射机制创建User的实例,调用了User的无参构造函数。

然后在readObject方法执行的时候,同样会先执行User类的readExternal方法。这个会在后续源代码分析时讲到

喜欢这篇文章?欢迎打赏~~

009e7e6833b3ff92e3933a7eeaa4600b.png


http://www.niftyadmin.cn/n/4388298.html

相关文章

html5-4 HTML5超链接、URL地址和表格

html5-4 HTML5超链接、URL地址和表格 一、总结 一句话总结&#xff1a; 1、cellspace有什么用&#xff1f; 清除表格的单元格间距 26 <table border1px cellspacing0px width100%> 2、页面中的字体一般用什么好&#xff0c;怎么设置&#xff1f; 微软雅黑&#xff0c…

两行代码激活windows系统

slmgr /skms kms.03k.org slmgr /ato 将以上代码存为bat文件运行

python使用time库创建时间路径和时间文件

import time import osclass FilePath(object):def __init__(self):# 获得当前系统时间的字符串self.local_time time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime(time.time()))print(self.local_time)print(type(self.local_time))# 获取年字符串self.year se…

java mongodb 查询 游标_MongoDB 游标详解及实例代码

MongoDB 游标详解MongoDB中的游标与关系型数据库中的游标在功能上大同小异。游标相当于C语言的指针&#xff0c;可以定位到某条记录&#xff0c;在MongoDB中&#xff0c;则是文档。因此在mongoDB中游标也有定义&#xff0c;声明&#xff0c; 打开&#xff0c;读取&#xff0c;关…

python web自动化测试之二次封装 selenium 类

from logs.logger import Logger from selenium.common.exceptions import NoSuchElementException import time import os from selenium import webdriver """""" """二次封装 selenium 类,又称之为通用类。用于给页面类使用 &…

java程序员昵称_那些神秘的Java程序员

我们都知道程序员的工作主要就是写代码&#xff0c;这样的工作可能会给他们带来近视、秃顶等种种问题。而之前我看过一档辩论型的综艺节目&#xff0c;从中了解到&#xff0c;在北京&#xff0c;女孩们的家长最希望自己未来的女婿是个程序员。这是为什么呢&#xff1f;原来她们…

vue 中 mixins 的详细介绍

mixins(混入)就是定义了一部分公共的方法、计算属性或者钩子函数等 vue 组件中的可复用功能&#xff0c;然后混合进各个组件中使用。下面我们具体来看看怎么使用。 创建一个 demo.js 文件&#xff0c;然后 export 给外部使用 export const demoMixins {data() {return {name: …

python+selenium webui自动化测试之打开浏览器封装两种方式ini配置文件或者yaml文件

yaml文件&#xff1a;# !/usr/bin/python # -*- coding:utf-8 -*-from logs.logger import Logger from selenium import webdriver import os from configfg.read_yaml import YamlReader import timelogger Logger(logger"BrowserEngine").get_log()# 浏览器引擎类…