序列化与反序列化

什么是序列化

  • java序列化是指把java对象转换为字节序列的过程,而java反序列化是指把字节对象恢复为java对象的过程
  • 序列化:对象序列化的最主要的用处就是在传递和保存对象的时候,保证对象的完整性和可传递性。序列化是把对象转换成有序字节流,以便在网络上传输或者在本地文件中。序列化后的字节流保存的java对象的状态以及相关的描述信息。序列化机制的核心作用就是对象状态的保存与重建。
  • 反序列化:客户端从文件中或网络上获得序列化后的对象字节流后,根据字节流中所保存的对象状态及描述信息,通过反序列化重建对象
  • 序列化就是把实体对象状态按照一定的格式写入到有序字节流,反序列化就是从有序字节流重建对象,恢复对象状态
为什么需要序列化与反序列化
  • 当两个进程进行远程通信时,可以互相发送各种类型的数据,包括文本,图片,音频,视频等,而这些数据都会以二进制的形式在网络上传送。
  • 当两个java进行通信时,要传送对象,怎么传对象,通过序列化与反序列化
  • 也就是说,发送方需要把对象装换为字节序列,然后在网络上传送,另一方面,接受方需要从字节序列中恢复出java对象
序列化的好处
  • 永久性保存对象,保存对象的字节序列到本地文件或者数据库中,实现了数据的持久化,通过序列化可以把数据永久的保存到硬盘上
  • 利用序列化实现远程通信,可以在网络上传送对象的字节序列
  • 在进程间传递对象
示例
package waking.test.io;

import java.io.Serializable;

/**
 * Students实体类
 * @author waking
 *
 */
public class Students implements Serializable{
	private int num;
	private String name;
	private String gender;
	private int age;
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "Students [num=" + num + ", name=" + name + ", gender=" + gender + ", age=" + age + "]";
	}
	
}
package waking.test.io;
/**
 * 序列化
 * @author waking
 *
 */

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class Demo15 {
	public static void main(String[] args) {
		FileOutputStream fos = null;
		ObjectOutputStream oos=null;
		try {
			fos =  new FileOutputStream("Student.out");
			oos = new ObjectOutputStream(fos);
			
			Students s = new Students();
			s.setNum(1);
			s.setName("waking");
			s.setGender("male");
			s.setAge(22);
			
			oos.writeObject(s);
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				if(fos!=null) {
					fos.close();
				}
				if(oos!=null) {
					oos.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}
package waking.test.io;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;

/**
 * 反序列化
 * @author waking
 *
 */
public class Demo16 {
	public static void main(String[] args) {
		ObjectInputStream ois = null;
		FileInputStream fis = null;
		
		try {
			fis = new FileInputStream("Student.out");
			ois = new ObjectInputStream(fis);
			
			Students s = (Students)ois.readObject();
			System.out.println(s.getNum()+"=="+s.getName()+"=="+s.getGender()+"=="+s.getAge());
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				if(fis!=null) {
					fis.close();
				}
				if(ois!=null) {
					ois.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}
对象流
  • 流中流动的数据是对象如果将一个对象写入到本地文件中,被称为对象的序列化,如果将一个本地文本中的对象读取出来,被称为对象反序列化
  • 注意:一个对象流只能操作一个对象,如果试图采用一个对象流操作多个对象的话,会出现EOFException【文件意思达到文件末尾】
  • 如果向将多个对象序列化到本地,可以借助于集合【将多个对象添加到集合中进行操作】
  • 以上代码用到对象流,可以观看

RandomAccessFile类

  • RandomAccessFile是用来访问那些保存数据记录的文件的,你就可以用seek()方法来访问记录,并进行读写了,这些记录的大小不必相同;但是其大小和位置必须是可知的。但是该类仅限于操作文件
package waking.test.io;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.RandomAccess;

/**
 * RandomAccessFile
 * @author waking
 *
 */
public class Demo17 {
	public static void main(String[] args){
		try {
			RandomAccessFile raf =new RandomAccessFile(new File("E://d.txt"), "rw");
			byte[] b =new byte[1024*8];
			int len = -1;
			while((len=raf.read(b))!=-1) {
				System.out.println(new String(b, 0, len));
			}
			raf.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
简单介绍,用兴趣可以交流
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值