Java序列化深入剖析和总结(精华)
2016-01-22 09:19
316 查看
1、什么是序列化和反序列化
序列化:在JVM中把对象拷贝到二进制流中反序列化:是把二进制流还原为对象
注意:序列化不仅仅是把对象以一连串字节描述的过程(其中涉及到流的输入输出操作),类被编译成二进制字节码文件加载到JVM中就不是序列化过程。
2.序列化的目的
1)对象序列化的目标是将对象保存到磁盘上,或允许在网络中直接传输对象、进程间传输对象(RPC是分布式框架hadoop实现的基础就用到了对象的序列化)
2)序列化是 RMI(Remote Method Invoke – 远程方法调用)过程的参数和返回值都必须实现的机制
2、什么情况下需要序列化
a)当你想把的内存中的对象保存到一个文件中或者数据库中时候b)当你想用套接字在网络上传送对象的时候
c)当你想通过RMI传输对象的时候
3、ransient关键字
可以让序列化对象的某些属性放弃序列化的机会
4、对于序列化对象中有引用对象的情况
引用对象必须实现序化5、实现序列化的方式
1)Serializable实现序列化:没有具体的方式2)Externalizable也可以实现序列化:有具体的方法
6.Externalizable的API
void | readExternal(ObjectInput in) 对象实现 readExternal 方法来恢复其内容,它通过调用 DataInput 的方法来恢复其基础类型,调用 readObject 来恢复对象、字符串和数组。 |
void | writeExternal(ObjectOutput out) 该对象可实现 writeExternal 方法来保存其内容,它可以通过调用 DataOutput 的方法来保存其基本值,或调用 ObjectOutput 的 writeObject 方法来保存对象、字符串和数组。 |
7、对比
1.Serializable实现序列化不需要程序员手动的参与序列化的过程.JVM已经为我们实现了整个序列化的过程2.Externalizable是Serializable的子类,需要程序员手动的参与序列化的过程,同时可以提供额外的数据的序列化.
3.Serializable序列化简单一些,但是要消耗性能,Externalizable比Serializable要高一些.
4.如果不需要过多的知道序列化的过程那么我们还是选者Serializable不容易出错,Externalizable比较容易出错
参考代码:
package com.test; import java.io.Serializable; public class Person implements Serializable { private static final long serialVersionUID = 1L; //transient关键字:可以让序列化对象的某些属性放弃序列化的机会 此时,测试结果为 null : 29 //private transient String name; private String name; private int age; //序列化对象中有引用对象的情况 private OtherClass otherClass = new OtherClass(); public OtherClass getOtherClass() { return otherClass; } public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } }
package com.test; import java.io.Serializable; public class OtherClass implements Serializable { }
package com.test;[/code]
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class ObjectStreamDemo {
public staticvoid test() throws Exception {
Person person= new Person("watchemen",29);
ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("C:/javaTest/person.txt"));
os.writeObject(person);
os.close();
ObjectInputStream ios = new ObjectInputStream(new FileInputStream("C:/javaTest/person.txt"));
Person person1 = (Person)ios.readObject();
System.out.println(person1.getName()+" : "+person1.getAge());
//OtherClass没有实现序列化时会报错
//OtherClass实现序列化后显示:com.test.OtherClass@35718057
System.out.println(person1.getOtherClass());
ios.close();
}
public staticvoid main(String[] args) throws Exception {
test();
}
}
package com.test;[/code]
/**
* 实现Externalizable接口实现序列化
*/
import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.util.Date;
public class Person1 implements Externalizable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
public Person1() {
}
public Person1(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
publicvoid readExternal(ObjectInput in) throws IOException,ClassNotFoundException {
this.name = (String) in.readObject();
this.age = in.readInt();
Date date = (Date) in.readObject();
System.out.println("date: " + date);
}
@Override
publicvoid writeExternal(ObjectOutput out) throws IOException {
//可以附加一些额外的功能
Date date = new Date();
out.writeObject(name);
out.writeInt(age);
out.writeObject(date);
}
}
package com.test;[/code]
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class ObjectStreamDemo1 {
public staticvoid test() throws Exception {
Person1 person1= new Person1("watchemen",29);
ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("C:/javaTest/person1.txt"));
os.writeObject(person1);
os.close();
ObjectInputStream ios = new ObjectInputStream(new FileInputStream("C:/javaTest/person1.txt"));
Person1 person2 = (Person1)ios.readObject();
System.out.println(person2.getName()+" : "+person2.getAge());
ios.close();
}
public staticvoid main(String[] args) throws Exception {
test();
}
}
相关文章推荐
- Eclipse 编写ANDROID 时在XML文件下无法自动生成R.java 成员变量id
- 【spring mvc】Spring MVC 的参数解析器ArgumentResolver阐述
- java注解开发
- svn 在64位win7下报Failed to load JavaHL Library解决办法
- 2016蓝桥杯假期任务之《振兴中华》
- Java的Hibernate框架数据库操作中锁的使用和查询类型
- "String cannot be resolved to a type"
- Java垃圾回收机制
- spring基本框架
- Java 日期时间
- 2016蓝桥杯假期任务之《马虎的算式》
- 2016蓝桥杯假期任务之《世纪末的星期》
- Eclipse 快捷键
- Eclipse 快捷键
- Java 异常
- Leetcode 231. Power of Two
- Hashcode Of A String In Java
- How java implements HashMap
- 学习Java语言必需掌握的知识点
- java中注解的使用