对象序列化并存储到文件和数据库

欢迎各位再次来到这里听小编解说!小编已经把最精彩的文章已经写在了下边,希望大家能耐心的把文章看完。你们的阅读就是我坚持创作的动力!麻烦你点点关注和评论!小编会永远记在心里的!!!

Java中要实现将对象保存起来持久化,需要让对象实现Serializable接口,这样就能将java对象用二进制流保存并恢复。下面我将以保存到文件和保存到mysql来进行解析。先给出序列化类的定义:

package model;

import java.io.Serializable;

import java.util.Date;

/*

* 实现可序列化接口

*/

public class Person implements Serializable{

private String name; //名字

private int year; //年龄

private String city; //城市

private Date birth; //生日

public String getName() {

return name;

public void setName(String name) {

this.name = name;

this.year=year;

this.city=city;

public int getYear() {

return year;

public void setYear(int year) {

this.year = year;

public String getCity() {

return city;

public void setCity(String city) {

this.city = city;

public Date getBirth() {

return birth;

public void setBirth(Date birth) {

this.birth = birth;

/*

* (non-Javadoc)

* @see java.lang.Object#toString()

* 重写toString,不然序列化之后显示的是内存地址

*/

public String toString(){

return this.name+" "+this.year+" "+this.city+" "+this.birth.toString();

1.保存对象到文件并恢复

要保存到文件首先必须得获得文件输入流,然后将文件输入流作为参数,构造对象输入流,然后就能直接将对象输入到文件中。而要将对象恢复,则需要先获得文件输出流,然后将文件输出流作为参数,构造对象输出流,就能够得到对象,然后再强制性转换为原始对象即可,实现代码如下:

package saveobject;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import model.Person;

public class FileHelper {

private String fileName;

public FileHelper(){

public FileHelper(String fileName){

this.fileName=fileName;

/*

* 将person对象保存到文件中

* params:

* p:person类对象

*/

public void saveObjToFile(Person p){

try {

//写对象流的对象

ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(fileName));

oos.writeObject(p); //将Person对象p写入到oos中

oos.close(); //关闭文件流

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

/*

* 从文件中读出对象,并且返回Person对象

*/

public Person getObjFromFile(){

try {

ObjectInputStream ois=new ObjectInputStream(new FileInputStream(fileName));

Person person=(Person)ois.readObject(); //读出对象

return person; //返回对象

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (ClassNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

return null;

2.保存对象到数据库并恢复

对象序列化之后得到的二进制流,所以要想保存序列化之后的对象,则必须用blob字段来保存。mysql中blob字段是用来存储二进制数据的。可以直接用PreparedStatement.setObject()方法来保存对象到数据库中。

而要将对象恢复,则首先需要读出二进制数据,读出的方法是用ResultSet.getBlob()方法,然后用Blob对象的getBinaryStream()方法来获得二进制流对象,然后将该二进制流对象作为参数构造带缓冲区的流对象BufferedStream,然后用byte[]数组从BufferedInputStream流中读取二进制数据,然后用该byte数组来构造ByteArrayInputStream,然后用ByteArrayInputStream来构造ObjectInputStream,最后直接用ObjectInputStream对象的readObject方法读出对象数据,并强制性转化为原始的对象数据。

实现代码如下所示:

package saveobject;

import java.io.BufferedInputStream;

import java.io.ByteArrayInputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.ObjectInputStream;

import java.sql.Blob;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.ArrayList;

import java.util.List;

import model.Person;

public class DBHelper {

private static Connection conn; //连接

private PreparedStatement pres; //PreparedStatement对象

static{

try {

Class.forName("com.mysql.jdbc.Driver"); //加载驱动

System.out.println("数据库加载成功!!!");

String url="jdbc:mysql://localhost:3306/testdb";

String user="root";

String password="20130436";

conn=DriverManager.getConnection(url,user,password); //建立连接

System.out.println("数据库连接成功!!!");

} catch (ClassNotFoundException | SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

/*

* 向数据库中的表testobj中插入多个Person对象

* params:

* persons:Person对象list

*/

public void savePerson(List persons){

String sql="insert into objtest(obj) values(?)";

try {

pres=conn.prepareStatement(sql);

for(int i=0;i

pres.setObject(1, persons.get(i));

pres.addBatch(); //实现批量插入

pres.executeBatch(); //批量插入到数据库中

if(pres!=null)

pres.close();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

/*

* 从数据库中读出存入的对象

* return:

* list:Person对象列表

*/

public List getPerson(){

List list=new ArrayList();

String sql="select obj from objtest";

try {

pres=conn.prepareStatement(sql);

ResultSet res=pres.executeQuery();

while(res.next()){

Blob inBlob=res.getBlob(1); //获取blob对象

InputStream is=inBlob.getBinaryStream(); //获取二进制流对象

BufferedInputStream bis=new BufferedInputStream(is); //带缓冲区的流对象

byte[] buff=new byte[(int) inBlob.length()];

while(-1!=(bis.read(buff, 0, buff.length))){ //一次性全部读到buff中

ObjectInputStream in=new ObjectInputStream(new ByteArrayInputStream(buff));

Person p=(Person)in.readObject(); //读出对象

list.add(p);

} catch (SQLException | IOException | ClassNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

return list;

测试用的main方法:

package controller;

import java.util.ArrayList;

import java.util.Date;

import java.util.List;

import model.Person;

import saveobject.DBHelper;

import saveobject.FileHelper;

public class MainApp {

public static void main(String[] args){

FileHelper fh=new FileHelper("E:\obj.txt");

Person p=new Person();

p.setName("张斌");

p.setYear(24);

p.setCity("威海");

p.setBirth(new Date(95,2,16));

fh.saveObjToFile(p); //存入person对象

Person person=fh.getObjFromFile(); //取出person对象

System.out.println(person.toString());

Person p1=new Person();

p1.setName("张斌");

p1.setYear(24);;

p1.setCity("江西");

p1.setBirth(new Date(94,1,2));

Person p2=new Person();

p2.setName("福国");

p2.setYear(30);

p2.setCity("吉林");

p2.setBirth(new Date(95,4,23));

Person p3=new Person();

p3.setName("羿赫");

p3.setYear(20);

p3.setCity("海南");

p3.setBirth(new Date(93,9,29));

DBHelper db=new DBHelper();

List slist=new ArrayList();

slist.add(p1);

slist.add(p2);

slist.add(p3);

//db.savePerson(slist);

List glist=db.getPerson();

for(int i=0;i

System.out.println(glist.get(i).toString());

程序结果截图:

数据库截图:

欢迎各位再次来到这里听小编解说!小编已经把最精彩的文章已经写在了下边,希望大家能耐心的把文章看完。你们的阅读就是我坚持创作的动力!麻烦你点点关注和评论!小编会永远记在心里的!!!

欢迎大家与我一起来探索科技!让我们走在科技的最前沿。小编已经把最精彩的内容写在下边,请您耐心的把文章阅读完可以吗?您的阅读就是我坚持创作的动力!此外,满足小编一个小小的请求好吗?帮忙点点关注,阅读完文章别忘了留下您宝贵的意见!好吧,我们现在开始一起探索吧!

非常感谢各位看官能在百忙之中阅读小编的文章,您们的阅读和评论是小编继续坚持创作的动力。你们的每一个评论,小编都会去非常认真的去阅读,你们提出的宝贵意见我也会虚心接受,争取每天都为大家带来更多的优质文章。让大家不但可以增长见识,还可以有个好的心情。希望您能喜欢小编的文章!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181030A0U8OH00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励