对象的序列化与反序列化在生成文件和存入数据库的应用小结

知识内容链接:点击打开链接

1.创建实现序列化接口的对象

package com.amayadream.webchat.pojo;

import java.io.Serializable;

public class Person implements Serializable{
	
	/**
	* @Fields serialVersionUID : 默认可反序列化版本ID
	*/
	private static final long serialVersionUID = 1L;
	private String name;//如果不需要序列化名字字段则在前加transient 如:transient private String name;
	private String city;
	private String age;
	private String sex;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getCity() {
		return city;
	}
	public void setCity(String city) {
		this.city = city;
	}
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", city=" + city + ", age=" + age + ", sex=" + sex + "]";
	}
	
	
}

2.创建编写序列化工具类

1)创建生成序列化文件的工具类,将对象序列化存入指定文件中,并不需要存入数据库。

/**
 * 
* @ClassName: FileHelper
* @Description: 文件序列化工具测试类
* @author A18ccms a18ccms_gmail_com
* @date 2018年6月7日 下午1:49:42
*
 */
public class FileHelper {
	/**
	 * 文件路径
	 */
	private String fileName;
	/**
	 * 对象信息写入状态
	 */
	private boolean flag = true;
	
	public FileHelper() {
		
	}
	
	public FileHelper(String fileName) {//文件路径构造器
		this.fileName = fileName;
	}
	/**
	 * 
	* @Title: saveFile
	* @Description: 将对象信息写入指定文件中
	* @param @param p    设定文件
	* @return void    返回类型
	* @throws
	 */
	public boolean saveFile(Person p) {
		try {
			//创建输入流对象
			ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(fileName));
			//将对象写入
			oos.writeObject(p);
			//关闭流
			oos.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			flag = false;
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			flag = false;
		}
		return flag;
	}
	/**
	 * 
	* @Title: readFile
	* @Description: 从指定文件中读取文件
	* @param @return    设定文件
	* @return Person    返回类型
	* @throws
	 */
	public Person readFile() {
		try {
			//创建输出流对象
			ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fileName));
			//读取流信息
			Person p = (Person)ois.readObject();
			//返回对象
			//关闭流
			ois.close();
			return p;
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		return null;
	}

2)创建序列化工具类,生成序列化数据流(byte数组),存入数据库,取出后反序列化,数据库使用mysql,因为已经转换成字符串类型,存储和查询具体就不写。

/**
	 * 
	* @Title: serialize
	* @Description: 输入文件序列化
	* @param @param file
	* @param @return    设定文件
	* @return byte[]    返回类型
	* @throws
	 */
	public byte[] serialize(Serializable value) {
		try {
			//序列化的核心是ByteArrayOutputStream
			ByteArrayOutputStream bao = new ByteArrayOutputStream();
			//创建输出流
			ObjectOutputStream oos = new ObjectOutputStream(bao);
			//输出流写操作
			oos.writeObject(value);
			//关闭流操作
			oos.flush();
			oos.close();
			//返回Byte数组
			return bao.toByteArray();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
	}
	
	/**
	 * 
	* @Title: roadSerializable
	* @Description: 读取文件反序列化
	* @param @param value
	* @param @return    设定文件
	* @return Serializable    返回类型
	* @throws
	 */
	public Object roadSerializable(byte[] value) {
		Object result;
		try {
			//反序列化的核心ByteArrayInputStream
			ByteArrayInputStream bai = new ByteArrayInputStream(value);
			//创建输入流
			ObjectInputStream ois = new ObjectInputStream(bai);
			//读取文件
			result  = ois.readObject();
			System.out.println("result>>>>>>>"+result);
			//关闭流
			ois.close();
			return result;
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
	}

3.controller中调用

/**
	 * 
	* @Title: saveFile
	* @Description: 将对象信息序列化存入数据库中
	* @param @return    设定文件
	* @return Result    返回类型
	* @throws
	 */
	@RequestMapping(value="serialize",method = RequestMethod.POST)
	public Result saveFileSerialize() {
		FileHelper fh=new FileHelper(); 
		//创建对象,模拟接受的数据
		Person p = new Person();
		p.setAge("11");
		p.setCity("湖北");
		p.setName("小明");
		p.setSex("男");
		//将对象序列化为byte数组
		byte by[] = fh.serialize(p);
		//存入数据库状态
		boolean flag = false;
		if(by!=null) {
			try {
				//因为在mysql中的字段类型我varchar 所以需要转化类型  固定转换编码类型,降低转换类型错误率
				//将字符串存入数据库
				flag = logDao.insertFile(new String(by,"ISO-8859-1"));
			} catch (UnsupportedEncodingException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}
		byte bb[] = null;
		try {
			//因为在mysql中的字段类型我varchar 所以需要转化类型  固定转换编码类型,降低转换类型错误率
			//将字符串从数据库取出转换成byte数组
			bb = logDao.selectFile().getBytes("ISO-8859-1");
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//强转为对象
		Person pp = (Person) fh.roadSerializable(bb);
		//判断取出从数据库取出是否有问题
		if(bb==null) {
			flag = false;
		}
		if(flag){
			return new Result(Result.SUCCESS, pp);
		}else {
			return new Result(Result.ERROR, pp);
		}
	}
	
	/**
	 * 
	* @Title: saveFile
	* @Description: 将对象序列化存入指定文件中
	* @param @return    设定文件
	* @return Result    返回类型
	* @throws
	 */
	@RequestMapping(value="file",method=RequestMethod.POST)
	public Result saveFile() {
		FileHelper fh=new FileHelper("E:\\obj.txt"); 
		Person p = new Person();
		p.setAge("11");
		p.setCity("湖北");
		p.setName("小明");
		p.setSex("男");
		//存入person对象
		boolean flag = fh.saveFile(p);
		if(flag){
			return new Result(Result.SUCCESS, fh.readFile());
		}else {
			return new Result(Result.ERROR, "序列化文件生成失败");
		}
	}

4.调用结果

数据库中字段:


读取数据库数据后发向前端的数据


生成指定文件


读取文件数据后发向前端的数据


这只是操作一个对象的序列化,操作多个对象只需要遍历操作即可。

小结:1.IO流的使用最后一定要关闭流。2.序列化存入数据库一定要规定编码,避免读取异常

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值