J2SE(八)Java之对象的序列化与反序列化
2016-04-15 14:24
453 查看
什么是序列化与反序列化
序列化是java提供的一种保存对象状态的机制(指实例变量,非方法),将对象转换为字节序列,可以对字节序列进行读写操作。
将字符序列恢复为对象的过程称之为反序列化。
什么情况下使用序列化
a)当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
b)当你想用套接字在网络上传送对象的时候;
c)当你想通过RMI传输对象的时候;
注意点:
a)序列化时,只对对象的状态进行保存,而不管对象的方法;
b)当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口;
c)当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化;
d)并非所有的对象都可以序列化,,至于为什么不可以,有很多原因了,比如:
1.安全方面的原因,比如一个对象拥有private,public等field,对于一个要传输的对象,比如写到文件,或者进行rmi传输 等等,在序列化进行传输的过程中,这个对象的private等域是不受保护的。
2. 资源分配方面的原因,比如socket,thread类,如果可以序列化,进行传输或者保存,也无法对他们进行重新的资源分 配,而且,也是没有必要这样实现。
序列化API:
java.io.ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。
java.io.ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。
只有实现了Serializable和Externalizable接口的类的对象才能被序列化。Externalizable接口继承自 Serializable接口,实现Externalizable接口的类完全由自身来控制序列化的行为,而仅实现Serializable接口的类可以 采用默认的序列化方式 。
序列化是java提供的一种保存对象状态的机制(指实例变量,非方法),将对象转换为字节序列,可以对字节序列进行读写操作。
将字符序列恢复为对象的过程称之为反序列化。
什么情况下使用序列化
a)当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
b)当你想用套接字在网络上传送对象的时候;
c)当你想通过RMI传输对象的时候;
注意点:
a)序列化时,只对对象的状态进行保存,而不管对象的方法;
b)当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口;
c)当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化;
d)并非所有的对象都可以序列化,,至于为什么不可以,有很多原因了,比如:
1.安全方面的原因,比如一个对象拥有private,public等field,对于一个要传输的对象,比如写到文件,或者进行rmi传输 等等,在序列化进行传输的过程中,这个对象的private等域是不受保护的。
2. 资源分配方面的原因,比如socket,thread类,如果可以序列化,进行传输或者保存,也无法对他们进行重新的资源分 配,而且,也是没有必要这样实现。
序列化API:
java.io.ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。
java.io.ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。
只有实现了Serializable和Externalizable接口的类的对象才能被序列化。Externalizable接口继承自 Serializable接口,实现Externalizable接口的类完全由自身来控制序列化的行为,而仅实现Serializable接口的类可以 采用默认的序列化方式 。
package com.review.Serializable; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; public class People implements Serializable { private static final long serialVersionUID = -4482502256611631833L; private int age; private String name; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "People [age=" + age + ", name=" + name + "]"; } // 序列化 public static void serializable(People p) throws IOException { FileOutputStream fos = new FileOutputStream("people.txt"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(p); oos.close(); fos.close(); } // 反序列化 public static void deserializable() throws IOException, ClassNotFoundException { FileInputStream fis = new FileInputStream("people.txt"); ObjectInputStream ois = new ObjectInputStream(fis); People p = (People) ois.readObject(); System.out.println(p.toString()); ois.close(); fis.close(); } public static void main(String[] args) throws IOException, ClassNotFoundException { People p=new People(); p.setAge(17); p.setName("xxx"); serializable(p); deserializable(); } }
相关文章推荐
- J2SE与c#的几点比较
- JDK、J2EE、J2SE、J2ME四个易混淆概念区分
- jdk,j2ee,j2se,j2me的概念区别
- 一道小面试题:不借助中间变量实现连个整数交换
- @SuppressWarnings注解
- Linux下启动、停止J2SE程序(脚本)
- 【Java基础】抽象类和接口的区别
- 【Java基础】多态性
- 【Java基础】重写与重载
- [存档]J2ME中随机数字处理全攻略
- 为 SWT Windows桌面程序定制适合分发的 JRE
- Java日记(1) 一. 认识Java
- 08月28日学习杂记(复习:ANT,集合及零散知识点)
- 转载容器类的介绍
- 转载J2SE新功能
- 入门学习钥匙
- java学习笔记(1)
- java中的时间操作
- 随便写点,非计算机专业学生
- Java Networking and Proxies