一.序列化概念
  几乎只要是我们的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. 2019牛客暑期多校训练营(第二场) - H - Second Large Rectangle - dp

    https://ac.nowcoder.com/acm/contest/882/H 正确的办法:dp1[i][j]表示以i,j为底的矩形的高.得到dp1之后,dp2[i][j]表示以dp1[i][j] ...

  2. Mint-Linux【最佳】【快速】安装微信、企业微信、TIM、QQ等软件

    废话不多说 直接上教程 注意看 方式一.在线安装 在本地目录下.如 /home/root/Document 直接使用在线安装脚本,安装最新的Release版本: wget -qO- https://r ...

  3. Python之带有外部状态的生成器函数

    带有外部状态的生成器函数,也就是你的生成器暴露外部状态给用户解决: 定义一个类,然后把生成器函数放到 __iter__() 方法中过去 定义一个类,然后把生成器函数放到 __iter__() 方法中过 ...

  4. spring(二):bean的生命周期

    bean的生命周期指的是bean的创建——>初始化——>销毁的过程,该过程是由spring容器进行管理的 我们可以自定义bean初始化和销毁的方法:容器在bean进行到当前生命周期时,调用 ...

  5. 2018-2-13-WPF-延迟加载

    title author date CreateTime categories WPF 延迟加载 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 17:23:3 + ...

  6. linux性能分析工具Vmstat

  7. Android使用gradle依赖管理、依赖冲突终极解决方案(转)

    Android使用gradle依赖管理.依赖冲突终极解决方案在Android开发中,相信遇到关于版本依赖的问题的同学有不少.虽然Android Studio一般都会自动帮我们去重,但是有时候去重失败了 ...

  8. lmbench的使用方法

    一.引言 要评价一个系统的性能,通常有不同的指标,相应的会有不同的测试方法和测试工具,一般来说为了确保测试结果的公平和权威性,会选用比较成熟的商业测试软件.但在特定情形下,只是想要简单比较不同系统或比 ...

  9. Linux的启动SD卡的格式化方法

    要在OMAP3530上运行Linux,首先要知道如何启动OMAP3530,并且将MLO,XDLR,UBOOT,UImage以及文件系统等镜像程序下载到OMAP3530的芯片中去. OMAP3530提供 ...

  10. mysql 数据库连接状态查询

    查看当前数据库进程 show processlist