知识内容链接:点击打开链接
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.序列化存入数据库一定要规定编码,避免读取异常