您的位置:首页 > 编程语言 > Java开发

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;

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();
}

}
[/code]

 package com.test;
/**
* 实现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);
}

}
[/code]

 package com.test;

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();
}

}
[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: