java之序列化与反序列化

一、序列化与反序列化概念:

 java序列化:也就是将java对象转换为字节序列。

 java反序列化:也就是将字节序列转换为java对象。


那么我们的序列化和放序列化到底有什么作用呢,为什么要序列化和反序列化?


二、序列化和反序列化的作用:

1.可以把对象序列化后永久存储到硬盘上,通常存放在某一个文件里面。

2.将对象转换为网络传输对象的字节序列。

      在很多场景下,需要对某些对象进行序列化,让它们离开内存空间,永久存放在物理硬盘,以便长期保存。例如最常见的是Web服务器中的Session对象,当有 10万用户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把一些seesion先序列化到硬盘中,等要用了,再把保存在硬盘中的对象反序列化还原到内存中。

当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象序列化为字节序列,才能在网络上传送;接收方则需要把字节序列再反序列化为Java对象。

三、序列化操作:

java.io.ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列

化,把得到的字节序列写到一个目标输出流中。

java.io.ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反

序列化为一个对象,并将其返回。

只有实现了Serializable和Externalizable接口的类的对象才能被序列化。Externalizable接口继承自 Serializable接口,

实现Externalizable接口的类完全由自身来控制序列化的行为,而仅实现Serializable接口的类可以 采用默认的序列化方式 。


四、实例代码:

序列化对象:

import java.io.Serializable;

public class Employee implements Serializable {
	private String name;
	private int age;
	private String job;
	private String gender;
	
	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 getJob() {
		return job;
	}
	public void setJob(String job) {
		this.job = job;
	}
	public String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}

}
序列化操作:

public class SerializeDemo
{
   public static void main(String [] args)
   {
      Employee e = new Employee();
      e.setName("德玛西亚");
      e.setAge(22);
      e.setJob("软件工程师");
      e.setGender("男")
      try
      {
         FileOutputStream fileOut =
         new FileOutputStream("/tmp/employee.ser");//注意: 当序列化一个对象到文件时, 按照Java的标准约定是给文件一个.ser扩展名。
         ObjectOutputStream out = new ObjectOutputStream(fileOut);
         out.writeObject(e);
         out.close();
         fileOut.close();
         System.out.printf("Serialized data is saved in /tmp/employee.ser");
      }catch(IOException i)
      {
          i.printStackTrace();
      }
   }
}

反序列化操作:
import java.io.*;
public class DeserializeDemo
{
   public static void main(String [] args)
   {
      Employee e = null;
      try
      {
         FileInputStream fileIn = new FileInputStream("/tmp/employee.ser");
         ObjectInputStream in = new ObjectInputStream(fileIn);
         e = (Employee) in.readObject();
         in.close();
         fileIn.close();
      }catch(IOException i)
      {
         i.printStackTrace();
         return;
      }catch(ClassNotFoundException c)
      {
         System.out.println("Employee class not found");
         c.printStackTrace();
         return;
      }
      System.out.println("Deserialized Employee...");
      System.out.println("Name: " + e.getName());
      System.out.println("Age: " + e.getAge());
      System.out.println("Job: " + e.getJOb());
      System.out.println("Gender: " + e.getGender());
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值