对象序列化

本文深入探讨了对象序列化概念,解释了如何通过实现Serializable接口将类转化为对象流,并通过实例演示了对象的序列化与反序列化过程。同时介绍了如何在序列化过程中忽略或自定义特定字段的行为,以及如何手动处理不支持序列化的字段。

序列化概述

简单来说序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化,流的概念这里不用多说(就是I/O),我们可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间(注:要想将对象传输于网络必须进行流化)!在对对象流进行读写操作时会引发一些问题,而序列化机制正是用来解决这些问题的!

序列化的实现

将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implementsSerializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Objectobj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。

import java.io.*; public class ObjectStream { public static void main(String[] args) { try{ FileOutputStream fos=new FileOutputStream("res//student.dat" ); ObjectOutputStream oos=new ObjectOutputStream(fos); oos.writeObject(new Person("张三","男",10,"移动","篮球","河北")); oos.writeObject(new Person("李四","女",12,"移动","乒乓球","河南")); oos.writeObject(new Person("王五","男",14,"移动","足球","河北")); oos.close(); FileInputStream fis=new FileInputStream("res//student.dat"); ObjectInputStream ois=new ObjectInputStream(fis); try{ while(ois.available()!=-1){ Person p=(Person)ois.readObject(); p.show(); } }catch(EOFException eof){ ois.close(); } }catch(IOException ie){ System.out.println(ie.getMessage()); }catch(ClassNotFoundException cfe){ System.out.println(cfe.getMessage()); } } }


程序运行结果为:

修改默认的序列化机制

在序列化的过程中,有些数据字段我们不想将其序列化,对于此类字段我们只需要在定义时给它加上transient关键字即可,对于transient字段序列化机制会跳过不会将其写入文件,当然也不可被恢复。但有时我们想将某一字段序列化,但它在SDK中的定义却是不可序列化的类型,这样的话我们也必须把他标注为transient,可是不能写入又怎么恢复呢?好在序列化机制为包含这种特殊问题的类提供了如下的方法定义:

private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException; private void writeObject(ObjectOutputStream out) throws IOException;


(注:这些方法定义时必须是私有的,因为不需要你显示调用,序列化机制会自动调用的)

使用以上方法我们可以手动对那些你又想序列化又不可以被序列化的数据字段进行写出和读入操作。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值