一.序列化概念
  几乎只要是我们的java开发,就一定会存在有序列化的概念,而正是有序列化的概念逐步发展,慢慢也有了更多的系列化的标准.
--所谓的对象序列化指的是将内存中保存的对象,以二进制数据流的形式进行处理,可以实现对象的保存或网络传输.我们首先需要知道所谓的对象都是处在堆内存当中的(每一块堆内存中描述的就是我们所说的真正的对象),我们所需要做的就是将内存中的数据保存为文件或者发送到远程的服务器上,这样所有的客户都可以获取到我的对象,也可以将是数据保存到数据库中,在需要的时候进行数据的读取.
--然而并不是所有的对象都可以被序列化,在java中有一个强制性的要求:如果要序列化对象,那么对象所在的类一定要实现java.io.Serializable(JDK1.1)父接口,作为我们序列化的标记.我们可以发现这个接口是一个空接口,因为它描述的是一种类的能力.
--范例:定义一个可以被序列化的类

 class Person implements Serializable {       //这样就表示这个类可以被序列化
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}

--此时Person类产生的每一个对象都可以实现二进制的数据传输,属于可以被序列化的程序类

二.序列化与反序列化
  有了序列化的支持类之后,如果要实现序列化和反序列化的操作就可以实现利用以下两个类完成:
--序列化与反序列化支持类:
  序列化:ObjectOutputStream(JDK1.1)  public final void writeObject(Object obj) throws IOException

  反序列化:ObjectInputStream(JDK1.1)  public final Object readObject()throws IOException, ClassNotFoundException

--范例:实现序列化:

 package IO常用类库.对象序列化;

 import java.io.*;

 /**
* @author : S K Y
* @version :0.0.1
*/
class Person implements Serializable { //这样就表示这个类可以被序列化
private String name;
private int age; public Person(String name, int age) {
this.name = name;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
} public class SerializableDemo {
public static final File SAVE_FILE =
new File("D:" + File.separator + "java-test" + File.separator + "person.save"); public static void main(String[] args) throws IOException, ClassNotFoundException {
Person person = new Person("张三", 22);
saveObject(person);
Person readPerson = (Person) loadObject();
System.out.println(readPerson);
} public static void saveObject(Object obj) throws IOException {
if (!SAVE_FILE.getParentFile().exists()) {
SAVE_FILE.getParentFile().mkdirs();
}
ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(SAVE_FILE));
outputStream.writeObject(obj); //序列化
outputStream.close();
} public static Object loadObject() throws IOException, ClassNotFoundException {
ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(SAVE_FILE));
Object object = inputStream.readObject(); //反序列化
inputStream.close();
return object;
} }

--在java中的对象序列化和反序列化必须使用内部提供的对象操作流,因为这里面牵扯到二进制数据的格式,因此无法自定义处理,另外如果要想实现一组对象的序列化,则可以使用对象数组完成,在很多的实际项目的开发之中,开发者很少能够见到这两个类的直接操作,因为会有一些程序类容器帮助开发者自动实现.

三.transient关键字
  默认情况下当执行了对象序列化后会将类中的全部属性的内容进行全部的序列化,但是很多情况下有一些属性可能并不需要进行序列化的处理,这个时候就可以在属性定义上使用transient关键字来完成

 package IO常用类库.对象序列化;

 import java.io.*;

 /**
* @author : S K Y
* @version :0.0.1
*/
class Person implements Serializable { //这样就表示这个类可以被序列化
private transient String name; //在进行序列化处理的时候name属性的内容将不会被保存下来
private int age; public Person(String name, int age) {
this.name = name;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
} public class SerializableDemo {
public static final File SAVE_FILE =
new File("D:" + File.separator + "java-test" + File.separator + "person.save"); public static void main(String[] args) throws IOException, ClassNotFoundException {
Person person = new Person("张三", 22);
saveObject(person);
Person readPerson = (Person) loadObject();
System.out.println(readPerson);
} public static void saveObject(Object obj) throws IOException {
if (!SAVE_FILE.getParentFile().exists()) {
SAVE_FILE.getParentFile().mkdirs();
}
ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(SAVE_FILE));
outputStream.writeObject(obj); //序列化
outputStream.close();
} public static Object loadObject() throws IOException, ClassNotFoundException {
ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(SAVE_FILE));
Object object = inputStream.readObject(); //反序列化
inputStream.close();
return object;
} }

--如果假设类之中是有一些需要计算保存的属性内容,往往是不需要被序列化的(商品的数量,单价,总价),这个时候就可以使用这个关键字,但是在实际的开发之中,大部分需要被序列化的往往都是简单的java类,所以这个关键字的出现频率并不高

javaIO流(五)--对象序列化的更多相关文章

  1. I/O 流和对象序列化

    一.I/O 流(java 如何实现与外界数据的交流) 流定义: 任何有能力产出数据的数据源对象或者有能力接收数据的数据源对象.他屏蔽了实际的I/O设备处理数据的细节. 1.Input/Output:指 ...

  2. JAVA基础学习day22--IO流四-对象序列化、管道流、RandomAccessFile、DataStream、ByteArrayStream、转换流的字符编码

    一.对象序列化 1.1.对象序列化 被操作的对象需要实现Serializable接口 1.2.对象序列化流ObjectOutputStream与ObjectInputStream ObjectInpu ...

  3. IO流(File类,IO流的分类,字节流和字符流,转换流,缓冲流,对象序列化)

    1.File类 File类可以在程序中 操作文件和目录.File类是通过建立File类对象,在调用File类的对象来进行相关操作的. 示例: public class Demo01 { public  ...

  4. js之oop <五>对象序列化(js的JSON操作)

    js对象序列化的过程,就是对象转换为JSON的过程.JSON.stringify() 将对象序列化成JSON.(接收对象,输出字符串) var obj = {x:2,y:3}; var str = J ...

  5. java-IO流(File对象-深度遍历指定目录下的文件夹和文件)

    需求:遍历这个树状结构 File(String pathname) '\\'为了转义'\' // 通过抽象路径pathname 创建一个新的文件或者目录 File parent = new File( ...

  6. 021.12 IO流 ObjectStream对象序列化

    内容:通过文件存储对象我们遇到的问题,需要保存对象到硬盘中,如何解决这个就是用来解决的 用法:1.创建流对象FileOutputstream2.创建ObjectOutputStream对象与FileO ...

  7. [javaSE] IO流(对象序列化)

    写入 获取ObjectOutputStream对象,new出来,构造参数:FileOutputStream对象目标文件 调用ObjectOutputStream对象的writeObject()方法,参 ...

  8. java --对象流与对象的序列化

    对象流 ObjectInputStream ObjectOutputStream类分别是InputStream和OutputStream的子类,对象输出流使用writeObject(Object ob ...

  9. 【Java IO流】对象的序列化和反序列化

    对象的序列化和反序列化 1)对象序列化,就是将Object对象转换成byte序列,反之叫对象的反序列化. 2)序列化流(ObjectOutputStream),是字节的过滤流—— writeObjec ...

随机推荐

  1. Codeforces 208E. Blood Cousins

    传送门 题目大意: 小C喜欢研究族谱,这一天小C拿到了一整张族谱. 小C先要定义一下k-祖先. x的1-祖先指的是x的父亲 x的k-祖先指的是x的(k-1)-祖先的父亲 小C接下来要定义k-兄弟 x的 ...

  2. Linux就该这么学05学习笔记

    参考链接:https://www.linuxprobe.com/chapter-05.html   1.用户身份和能力 用户 管理员UID为0:系统的管理员用户. 系统用户UID为1-999: Lin ...

  3. 4——class和struct

    class的定义看上去很像struct定义的扩展, 事实上,类定义时的关键字class完全可以替换成struct,也就是说,结构体变量也可以有成员函数. class和struct的唯一区别在于:str ...

  4. win10 护眼

  5. 嵌入式系统的性能测试(1) – lmbench篇

    要评价一个系统的性能,通常有不同的指标,相应的会有不同的测试方法和测试工具.既有比较成熟的商业测试软件,也有许多优秀的开源工具来完成这个任务.本文简要介绍如何使用lmbench来完成系统综合性能测试. ...

  6. P4707 重返现世 扩展 MinMax 容斥+DP

    题目传送门 https://www.luogu.org/problem/P4707 题解 很容易想到这是一个 MinMax 容斥的题目. 设每一个物品被收集的时间为 \(t_i\),那么集齐 \(k\ ...

  7. 基于vue的移动端web音乐播放器

    声明 以下只是学习完慕课网huangyi老师实战视频课程的笔记内容,仅供个人参考学习使用.如果对Vue2.0实战高级-开发移动端音乐WebApp感兴趣的话,请移步这里:https://coding.i ...

  8. Servlet学习request对象总结

    一.servletContext对象和request对象的比较 ServletContext 何时创建:服务器启动 何时销毁:服务器关闭 域的作用范围:整个web应用 request 何时创建:访问时 ...

  9. python多个装饰器

    '''在装饰器中加上参数:1.实现在源代码中加上时间统计:函数timmer2.实现用户名认证功能:函数auth23.实现一次认证,刷新后自动登录功能,index函数已经认证并登录,在执行home函数时 ...

  10. [转]解决win10下localhost打不开的问题

    博主刚开始玩Tornado,结果localhost都打不开,各种找寻解决方案,结论都是IIS服务器问题.然而win10下的解决方法居然没人写过...那就我来配图详解下. 打开控制面板--添加或删除程序 ...