Java对象的序列化与反序列化
来源:互联网 发布:淘宝上的aj是正品吗 编辑:程序博客网 时间:2024/05/16 14:08
什么是序列化与反序列化?
- java虚拟机new出的对象存储在内存中,序列化就是将对象转换为字节流的过程,写入到文件中保存起来或通过网络传输。反序列化是将字节流读取后转换成序列化之前的对象。
- 举个例子:定义了一个person类,其中类里面有姓名 String name,性别 String sex,年龄 int age等成员变量。new出一个对象后赋予对象相关属性,但是这个属性是在内存中保存的,java JVM(虚拟机)关闭后这个对象就会消失,那么如何将该对象保存呢?即使用序列化将对象转换成字节流再写入到文件中,再次启动JVM后,可以通过反序列化将字节流转换为对象,该对象具有序列化之前的所有非静态变量的属性,即person中的name,sex,age属性不变。
如何进行序列化、反序列化?
- java实现序列化的过程比较简单,通常不需要编写保存或恢复对象的过程代码,实现java.io.Serializable接口的类的对象就可以转换字节流或者从字节流中恢复,不需要在类里面实现任何代码。
- Serializable接口没有定义任何成员,只是表示一个类可以被序列化。
- 当一个对象被序列化时,只保存对象的非静态成员变量,不保存任何方法和静态成员变量。
- 如果一个对象的成员变量是另一个类的对象,那么这个对象的数据也会被保存。
- 声明成transient的变量不会被序列化存储。
- 如果对象中包含的对象的引用是不可序列化的,那么序列化会失败,抛出NotSerializable异常。
序列化、反序列化相关接口和类
- ObjectOutput接口
- ObjectOutput接口继承DataOutput接口并支持对象序列化,其中writeObject()方法的作用为序列化一个对象,可以讲对象放入文件里。
- 出错引发IOException
- ObjectOutputStream类
- ObjectOutputStream类继承OutputStream 类和实现ObjectOutput 接口。它负责向流写入对象。该类的构造方法如下:
–ObjectOutputStream(OutputStream outStream) throws IOException - 参数outStream 是序列化的对象将要写入的输出流。
- ObjectOutputStream类继承OutputStream 类和实现ObjectOutput 接口。它负责向流写入对象。该类的构造方法如下:
- ObjectInput接口
- ObjectInput 接口继承DataInput接口。它支持对象序列化。特别注意 readObject( )方法,它叫反序列化对象,是从文件里面读取出对象。所有这些方法在出错情况下引发IOException 异常。
- ObjectInput 接口继承DataInput接口。它支持对象序列化。特别注意 readObject( )方法,它叫反序列化对象,是从文件里面读取出对象。所有这些方法在出错情况下引发IOException 异常。
- ObjectInputStream类
- ObjectInputStream 继承InputStream 类并实现ObjectInput 接口。ObjectInputStream 负责从流中读取对象。该类的构造方法如下:
– ObjectInputStream(InputStream inStream) throws IOException,StreamCorruptedException - 参数inStream 是序列化对象将被读取的输入流。
- ObjectInputStream 继承InputStream 类并实现ObjectInput 接口。ObjectInputStream 负责从流中读取对象。该类的构造方法如下:
import java.io.Serializable;public class person implements Serializable {public String name;public String sex;public int age;public void sayhello() {System.out.println(this.name + " say hello");}public void sayall() {System.out.println(this.name + " " + this.sex + " " + this.age);}public person(String name, String sex, int age) {this.name = name;this.sex = sex;this.age = age;}}
import java.io.*;public class SerializeDemo {public static void main(String[] args) {person np1 = new person("prime7", "nan", 22);try {FileOutputStream fos = new FileOutputStream("person.txt");ObjectOutputStream oos = new ObjectOutputStream(fos);oos.writeObject(np1);oos.flush();oos.close();} catch (Exception ex) {ex.printStackTrace();}np1.sayhello();person np2 = null;try {FileInputStream fis = new FileInputStream("person.txt");ObjectInputStream ois = new ObjectInputStream(fis);np2 = (person) ois.readObject();np2.sayall();ois.close();} catch (Exception ex) {ex.printStackTrace();}}}
0 0
- Java 对象的序列化与反序列化实践
- Java对象的序列化与反序列化
- Java对象的序列化与反序列化
- Java对象的序列化与反序列化
- 【Java】对象的序列化与反序列化
- java对象的序列化与反序列化
- Java对象的序列化与反序列化
- Java对象的序列化与反序列化
- Java对象的序列化与反序列化
- Java对象的序列化与反序列化
- JAVA对象的序列化与反序列化
- Java对象的序列化与反序列化
- Java对象的序列化与反序列化
- Java对象的序列化与反序列化
- java对象的序列化与反序列化
- Java对象的序列化与反序列化
- Java对象的序列化与反序列化
- Java对象的序列化与反序列化
- 使用JS模拟出Map对象
- new Object() 过程
- COM 和 动态链接库的区别
- 新Azure 服务仪表盘!
- hadoop1.1.2 小文件解决方案
- Java对象的序列化与反序列化
- AppLibrary.dll中对Excel下载的用法
- cs硕士妹子找工作经历【阿里人搜等互联网】
- The Hardest Problem Ever
- Eclipse Android工程一些技巧
- Tomcat源码解析1:Eclipse导入Tomcat源代码
- Spinner 用法,标题可以显示
- Arrays
- 控件看不见或者看得见不能点击的原因小结