文档章节

java的序列化

 郭里奥
发布于 2017/09/11 19:07
字数 757
阅读 17
收藏 0

1.什么是序列化?

序列化就是将JVM当中正在运行的信息以字节信息表示

2.对象序列化?

对象序列化就是JVM中的对象信息(static ,transient 修饰的变量不会被序列化)以字节形式展示,使用ObjectInputStream或ObjectOutputStream操作实体类时应实现Serializable接口,使用XMLEncoder或XMLDecoder时,可以不实现该接口

3.什么时候使用序列化?

对象数据的持久化或对象数据的网络传输

下面就几个例子进行介绍:

一.进行序列化:

1.使用ObjectOutputStream序列化

    /**
	 * @param obj
	 *            需要被序列化的对象
	 * @param uri
	 *            序列化存储的目标位置包括文件名
	 * @return 将存储的结果文件返回
	 */
	public static File writeObject(List<Object> list, String uri)
	{
		File file = new File(uri);
		ObjectOutputStream out = null;
		OutputStream fout = null ;
		try
		{
			if (!file.exists())
				file.createNewFile();
			fout = new FileOutputStream(file,true);
			if(file.length() < 1){
				out = new ObjectOutputStream(fout);
			}else{
				out = new MyObjectOutputStream(fout);
			}
			for(Object obj : list){
				out.writeObject(obj);
			}
			out.flush();
		} catch (IOException e)
		{
			e.printStackTrace();
		} finally
		{
			if (out != null)
			{
				try
				{
					out.close();
				} catch (IOException e)
				{
					e.printStackTrace();
				}
			}
		}
		return file;
	}	

	//支持多次写入序列化结果写入同一文件
	static class MyObjectOutputStream extends ObjectOutputStream{

		protected MyObjectOutputStream() throws IOException, SecurityException
		{
			super();
			
		}
		public MyObjectOutputStream(OutputStream out) throws IOException {
			  super(out);
		}
		@Override
		protected void writeStreamHeader() throws IOException {
			  return;
		} 
		
	}

2.使用XMLEncoder序列化

    /**@param uri 目标文件路径及文件名
	 * @param obj 需要被序列化的对象
	 * @return 将序列化后的结果返回
	 * 使用java.beans.XMLEncode的类将对象序列化为XML格式的文件*/
	public static File xmlEncode(String uri ,List<Object> list){
		File file = new File(uri);
		XMLEncoder encode = null ;
		try{			
			encode = new XMLEncoder(new FileOutputStream(file,true),"utf-8",false,0);			
			for(Object each : list){
				encode.writeObject(each);
			}
			encode.flush();
		}catch(IOException e){
			e.printStackTrace();
		}finally{
			if(encode != null){
				encode.close();
			}			
		}
		return file;
	}

二.反序列化

1.使用ObjectInputStream

    /**
	 * @param file 需要反序列化的文件
	 * @return person 反序列化后得到对象,反序列化是不会调用该类的构造器
	 */
	public static List<Object> readObject(File file)
	{
		ObjectInputStream in = null;
		List<Object> list = new ArrayList<Object>();
		try
		{
			in = new ObjectInputStream(new FileInputStream(file));
			while(true){
				Object obj = in.readObject();
				list.add(obj);
			}
		} catch ( ClassNotFoundException e)
		{
			e.printStackTrace();
		} 
		catch(EOFException e){
			System.out.println("文件到达末尾");
			e.printStackTrace();
		}
		catch(IOException e){
			e.printStackTrace();
		}finally
		{
			// 关闭资源
			if (in != null)
			{
				try
				{
					in.close();
				} catch (IOException e)
				{
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		return list;
	}

2.使用XMLDecoder

     /**
	 * @param uri 将uri目标位置文件反序列化为一个对象
	 * @return 将反序列后的结果返回,会调用该类的无参构造函数,当该类没有无参的构造函数时,抛出java.lang.InstantiationException异常
	 * 所以要使用该方法进行反序列化时该类需要有无参的构造方法
	 * */
	public static List<Object> xmlDecode(String uri ){
		XMLDecoder decode = null ;
		File file = new File(uri);
		List list = new ArrayList();
		try{
			FileInputStream fin = new FileInputStream(file);
			Object obj = null ;
			decode = new XMLDecoder(fin);
			while((obj = decode.readObject()) != null){
				list.add(obj);
			}			
		}catch(FileNotFoundException e){
			e.printStackTrace();
		}catch (IOException e)
		{
			e.printStackTrace();
		}catch(ArrayIndexOutOfBoundsException e){
			e.printStackTrace();
		}finally{
			if(decode != null){
				decode.close();
			}
		}
		return list ;
	}

附加:本次试用的实体类

public class Person implements Serializable
{
	/**
	 * @author 郭暸
	 *
	 *
	 */
	private static final long serialVersionUID = -6922946081862337047L;
	private String name ;
	private transient Sex sex;
	private int age ;
	public Person(){
		
	}
	public String getName()
	{
		return name;
	}
	public Sex getSex()
	{
		return sex;
	}
	public int getAge()
	{
		return age;
	}
	public void setName(String name)
	{
		this.name = name;
	}
	public void setSex(Sex sex)
	{
		this.sex = sex;
	}
	public void setAge(int age)
	{
		this.age = age;
	}
 
    @Override
	public String toString(){
		return "name:"+this.name+"\tage:"+this.age+"\tsex:"+this.sex;
	}
	
}

 

© 著作权归作者所有

共有 人打赏支持
粉丝 1
博文 14
码字总数 6901
作品 0
西安
程序员
Java序列化与JSON序列化大比拼

一、背景 有项目需要传输Map结构的数据,有人倾向用Java序列化来做,有人倾向用JSON的序列化来做。所以我们还是比比吧。 Java观点:Object2Object,使用时简单快速。 JSON观点:JSON格式与语...

NoahX
2013/03/10
0
20
甲骨文称 Java 序列化的存在是个错误,计划删除

甲骨文计划从 Java 中去除序列化功能,因其在安全方面一直是一个棘手的问题。 Java 序列化也称为 Java 对象序列化,该功能用于将对象编码为字节流...Oracle 的 Java 平台小组的首席架构师 Ma...

达尔文
05/28
0
48
Android Serializable与Parcelable原理与区别

一、序列化、反序列化是什么? (1) 名词解释 对象的序列化 : 把Java对象转换为字节序列并存储至一个储存媒介的过程。 对象的反序列化:把字节序列恢复为Java对象的过程。 (2) 序列化详细解释 ...

KingMing
2015/04/16
0
0
Java序列化技术即将被废除!!!

我们的对象并不只是存在内存中,还需要传输网络,或者保存起来下次再加载出来用,所以需要Java序列化技术。Java序列化技术正是将对象转变成一串由二进制字节组成的数组,可以通过将二进制数据...

Java技术栈
05/30
0
0
Java序列化之Serializable

1.需求 1.什么是Java序列化 2.详解 1.序列化 理解为"打碎"即可 2.在书本上序列化的意思是将Java对象转为二进制 3.java平台允许我们在内存中创建对象,当JVM运行时对象才能存在,如果JVM停止,对...

村长大神
05/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Nginx防盗链、访问控制、解析php相关配置、Nginx代理

一、Nginx防盗链 1. 编辑虚拟主机配置文件 vim /usr/local/nginx/conf/vhost/test.com.conf 2. 在配置文件中添加如下的内容 { expires 7d; valid_referers none blocked server_names *.tes......

芬野de博客
今天
0
0
spring EL 和资源调用

资源调用 import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.PropertySource;import org.springframework.core.io.Resource;......

Canaan_
今天
0
0
memcached命令行、memcached数据导出和导入

一、memcached命令行 yum装telnet yum install telent 进入memcached telnet 127.0.0.1 11211 命令最后的2表示,两位字节,30表示过期时间(秒) 查看key1 get key1 删除:ctrl+删除键 二、m...

Zhouliang6
今天
0
0
Linux定时备份MySQL数据库

做项目有时候要备份数据库,手动备份太麻烦,所以找了一下定时备份数据库的方法 Linux里有一个 crontab 命令被用来提交和管理用户的需要周期性执行的任务,就像Windows里的定时任务一样,用这...

月夜中徘徊
今天
1
1
shell-日志脚本小实验

1.查找日志2018-8-15,求得那一分钟访问量最大。 #/bin/bash#from cc#2018-8-15#2018-08-15.log 哪一分钟 访问量 最大for d in `ls /data/nginx/logs/`doif [ -a 2018-08-15...

chencheng-linux
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部