javaIO流(五)--对象序列化
一.序列化概念
几乎只要是我们的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流(五)--对象序列化的更多相关文章
- I/O 流和对象序列化
一.I/O 流(java 如何实现与外界数据的交流) 流定义: 任何有能力产出数据的数据源对象或者有能力接收数据的数据源对象.他屏蔽了实际的I/O设备处理数据的细节. 1.Input/Output:指 ...
- JAVA基础学习day22--IO流四-对象序列化、管道流、RandomAccessFile、DataStream、ByteArrayStream、转换流的字符编码
一.对象序列化 1.1.对象序列化 被操作的对象需要实现Serializable接口 1.2.对象序列化流ObjectOutputStream与ObjectInputStream ObjectInpu ...
- IO流(File类,IO流的分类,字节流和字符流,转换流,缓冲流,对象序列化)
1.File类 File类可以在程序中 操作文件和目录.File类是通过建立File类对象,在调用File类的对象来进行相关操作的. 示例: public class Demo01 { public ...
- js之oop <五>对象序列化(js的JSON操作)
js对象序列化的过程,就是对象转换为JSON的过程.JSON.stringify() 将对象序列化成JSON.(接收对象,输出字符串) var obj = {x:2,y:3}; var str = J ...
- java-IO流(File对象-深度遍历指定目录下的文件夹和文件)
需求:遍历这个树状结构 File(String pathname) '\\'为了转义'\' // 通过抽象路径pathname 创建一个新的文件或者目录 File parent = new File( ...
- 021.12 IO流 ObjectStream对象序列化
内容:通过文件存储对象我们遇到的问题,需要保存对象到硬盘中,如何解决这个就是用来解决的 用法:1.创建流对象FileOutputstream2.创建ObjectOutputStream对象与FileO ...
- [javaSE] IO流(对象序列化)
写入 获取ObjectOutputStream对象,new出来,构造参数:FileOutputStream对象目标文件 调用ObjectOutputStream对象的writeObject()方法,参 ...
- java --对象流与对象的序列化
对象流 ObjectInputStream ObjectOutputStream类分别是InputStream和OutputStream的子类,对象输出流使用writeObject(Object ob ...
- 【Java IO流】对象的序列化和反序列化
对象的序列化和反序列化 1)对象序列化,就是将Object对象转换成byte序列,反之叫对象的反序列化. 2)序列化流(ObjectOutputStream),是字节的过滤流—— writeObjec ...
随机推荐
- CodeChef 3-Palindromes(Manacher+dp)
3-Palindromes Problem code: PALIN3 Submit All Submissions All submissions for this problem are ...
- Leetcode Lect1 String相关题目
Java 的 String 类基本用法介绍:http://www.runoob.com/java/java-string.html Java 的 String.substring 函数:https:/ ...
- 数组降维-JavaScript中apply方法妙用
海纳百川,有容乃大 1.普通循环转换方式 将多维数组(尤其是二维数组)转化为一维数组是业务开发中的常用逻辑,除了使用朴素的循环转换以外,我们还可以利用Javascript的语言特性实现更为简洁优雅的转 ...
- react学习笔记_01-jsx
const element = <h1>Hello, world!</h1>; 首先我们看到声明了一个element元素,而他的内容并非字符串或者html. 它被称为 JSX, ...
- css文本内容大于内本显示框设置其显示方式
1. <style type="text/css"> .text-ellipsis{ overflow: hidden;//隐藏滚动条 white-space: now ...
- OC学习--继承
1.什么是继承? 继承是指一个对象直接使用另一对象的属性和方法. 继承可以使得子类具有父类的各种属性和方法,而不是再次编写相同的代码.在子类继承父类的同时,可以重新定义某些属性,并重写某些方法, 即 ...
- java正则表达式移除网页中注释代码
/** * 移除网页中注释掉的代码 * * @param str * @return */ public static String removedisablecode(String str) { P ...
- Ehcahe独立使用
<?xml version="1.0" encoding="utf-8"?><ehcache xmlns:xsi="http://w ...
- Appium环境搭建(Appium库的安装)
Appium环境搭建 谷歌驱动和对照:注意:64位向下兼容,直接下载32位的就可以啦,亲测可用. https://blog.csdn.net/allthewayforward/article/deta ...
- cf 811c Vladik and Memorable Trip
原题链接:http://codeforces.com/contest/811/problem/C 题意:将数组中的连续数字连成若干个“线段”(或者不连),其实就是区间.区间必须满足对于其中的任意数字, ...