java序列化与反序列化,java序列化序列化
java序列化与反序列化,java序列化序列化
java序列化与反序列化
1.什么是序列化
Java序列化是指把Java对象转换成与平台无关的二进制流的过程,这些二进制流可以使Java对象脱离程序存在,从而可以保存在磁盘上,也可以在网络间传输;Java序列化是将一个Java对象写入IO流
Java反序列化是指把二进制流恢复为Java对象的过程,反序列化则是从IO流中恢复一个Java对象。
2.为什么进行序列化
1)实现远程通信,即在网络上传送对象的二进制流
当两个进程进行远程通信时,可以相互发送各种类型的数据,包括文本、图片、音频、视频等, 而这些数据都会以二进制序列的形式在网络上传送。那么当两个Java进程进行通信时,能否实现进程间的对象传送呢?答案是可以的。如何做到呢?这就需要Java序列化与反序列化了。换句话说,一方面,发送方需要把这个Java对象转换为二进制流,然后在网络上传送;另一方面,接收方需要从二进制流中恢复出Java对象。
2)实现数据的持久化
通过序列化可以把数据永久地保存到硬盘上(通常存放在文件里)
3.如何实现序列化
一个类的对象要被序列化,这该类就必须实现java.io.Serializable接口,其源码如下:
public interface Serializable {
}
可以发现此接口没有定义任何的方法,此接口只是一个标识接口,表示一个类具备了别序列化的能力。
如果要完成对象的输入或输出,必须依赖对象的输入流(ObjectInputStream)和 对象输出流(ObjectOutputStream)。
1、使用对象输出流输出序列化对象的过程称之为序列化。
2、使用对象输入流读入对象的过程称之为反序列化。
首先来 看一下ObjectOutPutStream和ObjectInputStream的构造函数和常用方法:
public ObjectOutputStream(OutputStream out) throws IOException :参数是输出流
public ObjectInputStream(InputStream in) throws IOException:参数是输入流
ObjectOutputStream.writeObject(Object):将对象序列化并写入到OutputStream中。
ObjectInputStream.readObject():将InputStream读出对象,这里可能需要强制转换。
**OutPutStream:首先代表这是个输出流,前面的**代表该输出流中存放的数据类型,可以是ByteArray,也可以是file,也可以是Data(代表java中的类对象)。
**InPutStream:首先是一个输入流,前面的**代表输入流从那种类型读取数据,可以是ByteArray,代表将数据读出到字节数组中。可以是Data,表示将数据读成Java中的类对象。
字节流包含两个顶层抽象类:InputStream和OutputStream。
1:字节流的两个顶层类是抽象类,分别是:InputStream和OutputStream。
2:每个抽象类都有子类来实现具体的功能,处理不同的设备的输入和输 出。
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class SerializableTest {
public static void main(String args[]){
ObjectOutputStream oos = null;
try {
oos = new ObjectOutputStream(new FileOutputStream(
"D:\\testserialize.txt"));
Student student = new Student("lulu",'女',18);
oos.writeObject(student);
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:\\testserialize.txt"));
Student studentInfo = (Student)ois.readObject();
String name = studentInfo.getName();
char sex = studentInfo.getSex();
int age = studentInfo.getAge();
System.out.println("name="+name+";sex="+sex+";age="+age);
} catch (Exception e) {
// TODO: handle exception
}
}
}
class Student implements Serializable
{
private String name;
private char sex;
private int age;
public Student(String name,char sex,int age)
{
this.name = name;
this.sex = sex;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
D盘中testserialize.txt的内容是
运行结果:
name=lulu;sex=女;age=18
相关文章
- 暂无相关文章
用户点评