Java中的序列化与反序列化
来源:互联网 发布:伏地魔魔杖数据 编辑:程序博客网 时间:2024/06/04 23:55
①什么时候需要使用序列化与反序列化
——一个对象存活时间不会比JVM还要长,但是当我们需要让一个对象在JVM停止运行之后还能持久保存,并且将来可以重新读取使用
——两个进程之间需要相互传送对象时也要使用序列化,一方面,发送方需要把这个Java对象转换为字节序列,然后在网络上传送;另一方面,接收方需要从字节序列中恢复出Java对象。
②序列化与反序列化
Java序列化是指把Java对象转换为字节序列的过程;而Java反序列化是指把字节序列恢复为Java对象的过程。
③JDK类库中序列化的API
java.io.ObjectOutputStream:表示对象输出流
它的writeObject(Object obj)方法可以对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。
java.io.ObjectInputStream:表示对象输入流
它的readObject()方法源输入流中读取字节序列,再把它们反序列化成为一个对象,并将其返回。
④怎么实现序列化
实现了Serializable或Externalizable接口的类的对象才能被序列化,否则抛出异常
⑤当一个类实现序列化后不想他全部成员都被序列化,我们要用transient关键字修饰
下面是一个例子,Student类实现了Serializable接口
import java.io.Serializable;import java.util.Calendar;public class Student implements Serializable { String name; int 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; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Calendar getBir() { return bir; } public void setBir(Calendar bir) { this.bir = bir; } String sex; Calendar bir;}测试类Main,将Student对象保存到文件中,实现序列化,再将对象读取出来,实现反序列化
import java.io.*;import java.util.Calendar;import java.util.HashMap;public class Main { public static void main(String[] args) { Calendar cal=Calendar.getInstance(); cal.clear(); cal.set(Calendar.YEAR,2014); cal.set(Calendar.MONTH,03); Student stu1=new Student(); stu1.setAge(3); stu1.setBir(cal); stu1.setSex("男"); stu1.setName("小明"); File file=new File("/Users/apple/Documents/序列化/java.pages"); try{//Student序列化过程 FileOutputStream fos = new FileOutputStream(file); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(stu1); oos.flush(); oos.close(); fos.close(); //Student对象反序列化过程 FileInputStream fis = new FileInputStream(file); ObjectInputStream ois = new ObjectInputStream(fis); Student st1 = (Student) ois.readObject(); System.out.println("name = " + st1.getName()); System.out.println("sex = " + st1.getSex()); System.out.println("age = "+ stu1.getAge()); System.out.println("birthday ="+ stu1.getBir()); ois.close(); fis.close(); }catch (IOException ioe){ System.out.println("ioe"); }catch(ClassNotFoundException filee) { System.out.println("file"); } }}控制台输出结果
如果Student类中的Name属性被关键字transient修饰,那么Name就不能被序列化
运行结果如下图:name为空,不能被序列化和反序列化
希望对大家有帮助!!!
阅读全文
0 0
- java中的序列化与反序列化
- Java中的序列化与反序列化
- Java中的序列化与反序列化
- java中的序列化与反序列化
- Java中的序列化与反序列化
- Java中的序列化与反序列化
- Java中的序列化与反序列化
- java序列化与反序列化
- java序列化与反序列化
- java序列化与反序列化
- java序列化与反序列化
- Java序列化与反序列化
- Java序列化与反序列化
- java 序列化 与 反序列化
- java序列化与反序列化
- JAVA序列化与反序列化
- java序列化与反序列化
- java序列化与反序列化
- 7-3 树的同构(25 分)
- 关于ubuntu老版本update时出现error 404 not found问题
- 博主的github链接
- django获取当前url
- Booking网站爬虫,获取酒店评论内容(Python)
- Java中的序列化与反序列化
- 会议记录管理系统(3)
- Android xmlns分类及使用
- Array和Arrays的区别
- APK在Android Studio下如何签名
- 数据库分库分表(sharding)系列
- 2.3 永远不需要销毁对象
- 112-Path Sum
- 蓝桥杯 算法提高 金陵十三钗