java序列化一个对象

java序列化一个对象

什么叫对象序列化:??

   其实就是把一个对象变为二进制的数据流的一种方法,通过对象序列化可以方便的实现对象的传输或存储,其实就是为了保存在内存中的各种对象的状态,并且可以把保存的对象状态再读出来。

写入序列化数据到文件中,主要是两个对象,一个对象是FileOutputStream 对象,一个是ObjectOutputStream 对象,ObjectOutputStream 负责向指定的流中写入序列化的对象。当从文件中读取序列化数据时,主要需要两个对象,一个是FileInputStream ,一个是ObjectInputStream 对象,ObjectInputStream 负责从指定流中读取序列化数据并还原成序列化前得对象。另外,序列化的读取数据与写入的顺序相同,比如我们序列化时先写入数据A ,再写入B ,最后写入C ;那么我们再读取数据的时候,读取到的第一个数据为A ,读取到的第二个数据为B ,最后读取到的数据为C ,即:先写入先读取的原则。 

在序列化一个对象的时候,这个对象必须实现java.io.Serializable 接口, Serializable 接口中不含任何方法,这个可以理解为声明该对象是可以序列化的方法吧。当我们在序列化一个对象时,有些属性我们不想序列化(可以减少数据量),那么我们可以声明该属性为瞬间态(用transient 关键字声明)。另外,静态字段也是不会被序列化的.

什么情况下需要序列化 ??

   1、把的内存中的对象保存到一个文件中或者数据库中时候

 2、远程进行对象的传输

为什么要对对象进行序列化?

   采用数据流来存储 ,以数据流传输会提高网络传输速度.


为什么要对对象进行序列化?

采用数据流来存储 ,以数据流传输会提高网络传输速度.




这里利用TestRead,TestWrite 类来测试序列化对象StudentSerializable ,StudentSerializable name 属性是瞬时态的,sex 属性是static ,pwd 是非瞬时态也非static 。

[1] 序列化对象SerializeStudent代码

package com.bwie.serializable;

import java.io.Serializable;

public class StudentSerializable implements Serializable {

	/**
	 * 类描述:用户信息
	 * 作者:李晓阳
	 * 日期:2016年6月23日 下午7:32:26
	 *
	 */
	
	/**

     * 序列化对象的标识,用于在反序列化的时候使用 <BR>

     * 反序列化的时候,如果当前内存中已经有这个标识的对象,则认为是同一类对象

     */ 
	private static final long serialVersionUID = 1L;
	
	 /** 演示瞬时态对象不会被序列化 */
	private transient String name;
	
	/**成员属性 */
	private String pwd;
	
	/**静态属性*/
	private static String sex;

	public void setName(String name) {
		this.name = name;
	}

	public void setPwd(String pwd) {
		this.pwd = pwd;
	}

	public void setSex1(String sex1) {
		sex = sex1;
	}

	@Override
	public String toString() {
		return "StudentSerializable [临时:name=" + name + ", 私有:pwd=" + pwd +", 静态:sex="+sex+ "]";
	}

}

<strong><span style="font-family:SimSun;font-size:18px;color:#333333;"><strong>[2] 测试类</strong></span></strong>TestWrite<strong><strong><span style="font-family:SimSun;font-size:18px;color:#333333;"></span></strong>代码(序列化写入)</strong>

package com.bwie.serializable;

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;


public class TestWrite {
	
	public static void main(String[] args) throws Exception {
		
		 // 1. 序列化文件保存的地址
		String filePath = "d://lyw.txt";
		
		// 2. 构造 SerializeStudent 对象
		StudentSerializable student = new StudentSerializable();
		
		// 由于 class 是 transient ,所以不会被序列化
		student.setName("lyw");
		
		// 非瞬时态又是非静态字段,所以肯定会序列化
		student.setPwd("123");
		
		// dept 是 static ,这里不会被序列化,如果被序列化的话,那么值应该为 computer
		student.setSex1("女");
		
		// 2. 构造序列化流
		FileOutputStream fos = null;
		ObjectOutputStream oos = null;
		try {
			fos = new FileOutputStream(filePath);
			oos = new ObjectOutputStream(fos);
			oos.writeObject(student);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			if(fos != null){
				fos.close();
			}
			if(oos != null){
				oos.close();
			}
		}
		
	}
}
<strong><span style="font-family:SimSun;font-size:18px;color:#333333;"><strong>[2] 测试类</strong></span></strong>Test<strong><span style="font-family:SimSun;">Read</span>代码(反序列化<span style="font-family:SimSun;">读出</span>)</strong>
package com.bwie.serializable;

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

public class TestRead {
	
	public static void main(String[] args) throws IOException {
		 // 1. 序列化文件的地址
		String filePath = "d://lyw.txt";
		
		// 2. 从序列化文件中读取出文件
		FileInputStream iStrem = null;
		
		ObjectInputStream oStream = null;
		
		try {
			
			iStrem = new FileInputStream(filePath);
			oStream = new ObjectInputStream(iStrem);
			
			// 读取信息
			StudentSerializable studentSerializable = (StudentSerializable)oStream.readObject();
			System.out.println(studentSerializable);
		
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			if(oStream !=null){
				oStream.close();
			}
			if(iStrem != null){
				iStrem.close();
				
			}
		}
	}
	
}












  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值