深圳Java培训:Java中的对象流和序列化

最近,在讲流的使用,其中对象流的作用其实就是将自定义类的对象与流之间相互转换的流。
看起来还是挺简单的,那么看下面的例子:

public class Student{
private int id;
private String name;
private String sex;
private String tel;

// 此处省略getter,setterpublic Student(int id, String name, String sex, String tel) {super();this.id = id;this.name = name;this.sex = sex;this.tel = tel;
}

}

public class TestObjectStream {
public static void main(String[] args) {
writeObject();
readObject();
}

public static void writeObject() {try {FileOutputStream fos = new FileOutputStream("C:/Users/wangliang/Desktop/1");ObjectOutputStream oos = new ObjectOutputStream(fos);Student student1 = new Student(1, "Mary", "female", "11111");Student student2 = new Student(2, "Jack", "male", "2222");Student student3 = new Student(3, "Andy", "male", "3333");List<Student> list = Arrays.asList(student1, student2, student3);oos.writeObject(list); // 写入对象oos.flush();fos.close();oos.close();} catch (Exception e) {e.printStackTrace();}
}public static void readObject() {try {FileInputStream fis = new FileInputStream("C:/Users/wangliang/Desktop/1");ObjectInputStream ois = new ObjectInputStream(fis);List<Student> list = (List<Student>)ois.readObject(); // 读取对象list.forEach(System.out::println);fis.close();ois.close();} catch (Exception e) {e.printStackTrace();}
}

}

然后在运行的过程发现出现如下的异常:
java.io.NotSerializableException: com.qianfeng.day33.entity.Student
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1378)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
at com.qianfeng.day33.test.TestObjectStream.writeObject(TestObjectStream.java:28)
at com.qianfeng.day33.test.TestObjectStream.main(TestObjectStream.java:16)

根据此异常的说明告诉我们,该实体类没有序列化,加上序列化的代码试试,如下:
public class Student implements java.io.Serializable{
private static final long serialVersionUID = 4500674287188895027L;

private int id;
private String name;
private String sex;
private String tel;// 此处省略getter,setterpublic Student(int id, String name, String sex, String tel) {super();this.id = id;this.name = name;this.sex = sex;this.tel = tel;
}

}
就是实现了一个java.io.Serializable接口,但是查看一下该接口源代码的说明:
*

  • @author unascribed
  • @see java.io.ObjectOutputStream
  • @see java.io.ObjectInputStream
  • @see java.io.ObjectOutput
  • @see java.io.ObjectInput
  • @see java.io.Externalizable
  • @since JDK1.1
    */
    public interface Serializable {
    }

发现该接口中并没有任何内容,上面描述中@see后面几乎就是对象流的一些操作,说明序列化的作用与对象流是相关的,那么序列化到底干了什么呢?
我们可以通过触类旁通的方式,来看看其他的语言中对序列化的要求,比如OC这门语言中的要求如下:
//流的数据(JSON数据) ---->OC对象

  • (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;
    //OC对象 ------->流的数据(Json数据)
  • (NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error;

在OC中,如果一个实体类需要实现序列化,必须要实现这两个方法,这两个方法的作用是告知系统,当需要将实体类以流的形式传输或保存成文件时,该如何转换成一个JSON数据(指定下key和value),然后可以使用字符串的方式转换成二进制(byte数组)。

那么在Java中为什么不需要呢?因为Java中有反射机制,可以很容易的完成这个内容。
那么序列化中序列号的作用是什么呢?是为了保证序列化和反序列化能够正确进行,只有当序列号一致,才能转换成功。

深圳Java培训:Java中的对象流和序列化相关推荐

  1. java流的序列化_Java中的对象流和序列化介绍

    最近,在讲流的使用,其中对象流的作用其实就是将自定义类的对象与流之间相互转换的流. 看起来还是挺简单的,那么看下面的例子: public class Student{ private int id; ...

  2. Java I/O中的对象序列化

    Java I/O中的对象序列化 Java对象序列化将那些实现了Serializable接口的对象转换成一个字节序列,并能够以后将这个字节序列完全恢复为原来的对象.利用对象的序列化,可以实现轻量级持久性 ...

  3. java流与文件——对象流和序列化

    [0]README 0.1) 本文描述转自 core java volume 2, 旨在理解 java流与文件--对象流和序列化 的相关知识: 0.2) for source code , pleas ...

  4. JAVA中创建的redis对象_详解Java在redis中进行对象的缓存

    java在redis中进行对象的缓存一般有两种方法,这里介绍序列化的方法,个人感觉比较方便,不需要转来转去. 一.首先,在存储的对象上实现序列化的接口 package com.cy.example.e ...

  5. 对象流java_Java中的对象流总结(必看篇)

    java中可以通过对象流将一个序列化的对象保存到硬盘中,或者硬盘中读取一个对象.对象流的存储和读取包含以下几点内容: 1.所保存的对象必须实现serializable接口. 2. 所保存的对象的属性也 ...

  6. java-IO流(4)-对象流及其序列化介绍

    目录 1对象流 2序列化和反序列化 2.1序列化ObjectOutputStream 2.1.1声明形式 2.1.2构造函数 2.1.3特有方法 2.2反序列化ObjectInputStream 2. ...

  7. 【Java I/O流】File、字符集、字节流、字符流、缓冲流、数据流、对象流、序列化、try-with-resources语句

    I/O流 File File 常用方法 File 练习:搜索.删除.剪切 字符集(Character Set) 字符编码(Character Encoding) 字符编码比较 乱码 try-with- ...

  8. Java深度学习系列——对象流和序列化

    前言: 我是张哲,一位在互联网上不愿透露姓名的小学员,接下来大家看到的所有内容都是我背写的知识点,这里的知识点和你所学习到的不同,我中和了我的一些书籍和网上刷的面试笔记,相信这里能让你接触到更深入的知 ...

  9. java与c++中的对象序列化分析

    有时候我们在开发项目的时候,对于数据的保存 我们通常是直接将数据保存到磁盘上面 ,但是这样操作起来非常的不方便 ,尤其是在大型的项目开发中.  对象的序列化 可以将对象以数据的形式存储到文件中:反之我 ...

最新文章

  1. Redis缓存穿透击穿雪崩
  2. div css 常用技巧
  3. php 数组美化_PHP格式化输出数组,一目了然
  4. Restrict Users to Use Old Passwords
  5. 火了这么久的 AI,现在怎么样了?
  6. oracle中affirm,2.Oracle Data Guard 参数介绍
  7. 使用WebStorm将项目部署到IIS
  8. mysql update commit吗_MySQL需要commit么
  9. 苹果宣布取消AirPower 因技术难题无法攻克
  10. XCode Installed!
  11. [20171124]xxd与通配符.txt
  12. mock gps android,GitHub - Hilaver/MockGPS: Android application to fake GPS
  13. ST电机库5.4.5FUL版本(ST MC SDK)
  14. Windows Phone 学习 Web搜索组件
  15. MD5 算法的加密、撞库破解及Python实现和操作演示
  16. 服务器创建文件失败是什么意思,网站提示无法创建文件错误解决详情(图文)...
  17. 折腾开源WRT的AC无线路由之路-1
  18. 太少的相濡以沫,太多的相忘江湖
  19. 2021.11.16【读书笔记】丨宏基因组分析流程
  20. 7-3 三维向量运算设计一个三维向量类,实现向量加法、减法以及向量与标量的乘法和除法运算。

热门文章

  1. 细数研究生和导师的那些恩怨情仇
  2. sdutacm-团战可以输、提莫必须死
  3. 关于智能车摄像头的基本学习步骤
  4. iMeta | 厦门大学马永慧组探究捐菌者对肠菌移植的伦理认知和态度
  5. 循环的嵌套:输出6行,“*“数目与行号相同
  6. 汽车零部件行业能不能用IPD
  7. C语言windows.h库的常用函数(四)
  8. 菜单权限及按钮权限控制
  9. mac idea切换多个项目窗口快捷键 command + shift + `
  10. 水库水位监测 水库监测预警系统方案