序列化(Serialization)一个对象

序列化一个对象

1. 序列化的概念

       序列化:首先,用日常生活中的例子来理解一下序列化。在我们日常生活中,运输一个整个的汽车总是不方便的,所以我们会把汽车拆开,当汽车变成一个个零件的时候,我们的运输任务也会轻松很多。那么在我们敲代码的时候,我们会用各种方式保存数据,那么java会提供给你自动的一种保存数据的方法,就是我们所说的序列化。正确的说:序列化是将数据结构或对象转换成二进制串的过程,简单点说序列化就是就是将数据分解成字节流,以便存储在文件中或在网络上传输的过程。反序列化就是打开字节流并重构对象。

2. 序列化的作用

   1)序列化是为了保存内存中各种对象的状态,并且可以把保存的对象状态再读出来。

   2)可以实现数据的持久化,在MVC模式中很有用

   3)可以对象数据的远程通信。

   4)对象序列化的作用:就是在传递,和保存对象(object)的时候,保证对象的完整性和可传递性。譬如通过网络传输,或者把一个对象保存成一个文件的时候,要实现序列化接口

3. 序列化的应用场景

   a)当你想把的内存中的对象保存到一个文件中或者数据库中时候;
   b)当你想用套接字在网络上传送对象的时候;
   c)当你想通过RMI传输对象的时候;

附加:Java RMI 指的是远程方法调用 (Remote Method Invocation)。它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法。可以用此方法调用的任何对象必须实现该远程接口。

4. 序列化如何实现

1)  写一个POJO类,实现Serializable.(必须实现这个接口,不然不能序列化)

<span style="font-size:18px;"> import java.io.Serializable;  

	public class Student implements Serializable{
		 private String name;  
		 private char sex;  
		 private int age;  
		 private double weight;
		 
		public Student() {
			super();
			// TODO Auto-generated constructor stub
		}
		
		public Student(String name, char sex, int age, double weight) {
			super();
			this.name = name;
			this.sex = sex;
			this.age = age;
			this.weight = weight;
		}
		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;
		}
		public double getWeight() {
			return weight;
		}
		public void setWeight(double weight) {
			this.weight = weight;
		}
	}  </span>


2)  创建一个序列化的类,需要创建一个File文件,可以看出序列化后的文件内容,为了演示效果,我这里用了.txt格式的文件,然后转化用转化成字节流的形式来序列化这几个对象

<span style="font-size:18px;">import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class Serializable{ 

	public static void main(String[] args) {
		Student stu = new Student("丫头",'女',20,45.2);  
		File  file = new File("G:/java/a.txt");
		
		try {
			file.createNewFile();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		try {
			FileOutputStream fos = new FileOutputStream(file);
			ObjectOutputStream oos = new ObjectOutputStream(fos);
			oos.writeObject(stu);
			oos.flush();
			oos.close();
			fos.close();
			
			  //Student对象反序列化过程  
			   FileInputStream fis = new FileInputStream(file);  
			   ObjectInputStream ois = new ObjectInputStream(fis);  
			   Student stu1 = (Student) ois.readObject();  
			   System.out.println("name = " + stu1.getName());  
			   System.out.println("sex = " + stu1.getSex());  
			   System.out.println("year = " + stu1.getAge());  
			   System.out.println("gpa = " + stu1.getWeight());  
			   ois.close();  
			   fis.close();  
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	}</span>


3) 看序列化后的结果

这个就是上面解释的二进制串,是容易传输的一种格式,如果想看结果,就要进行反序列化

 sr com.bao.StudentZ絈AE? I ageC sexD weightL namet Ljava/lang/String;xp   Ys@F櫃櫃櫄t 涓ご

4)反序列化。上述代码已经写出反序列化的代码,这个进行反序列化的结果

name = 丫头
sex = 女
age = 20
weight = 45.2








 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值