文档章节

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
西安
程序员
私信 提问
Android Serializable与Parcelable原理与区别

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

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

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

Java技术栈
05/30
0
0
Java序列化与JSON序列化大比拼

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

NoahX
2013/03/10
0
20
JAVA Serializable 类中的Serial Version ID

在JAVA中,当需要把一个类序列化的时候,显示提供一个serialVersionUID有什么用呢? a)小幅性能提升,免除JVM运行时对这个值的计算。 b)避免java.io.InvalidClassException,不同的JVM对ser...

晨曦之光
2012/04/25
1K
1
序列化框架比较:kryo & hessian & Protostuff & java

序列化框架性能对比(kryo、hessian、java、protostuff) 简介: 优点 缺点 Kryo 速度快,序列化后体积小 跨语言支持较复杂 Hessian 默认支持跨语言 较慢 Protostuff 速度快,基于protobuf ...

鉴客
2013/03/04
11K
0

没有更多内容

加载失败,请刷新页面

加载更多

缓存

并发情况下发生的缓存问题: 缓存一致性: 缓存穿透:是指在高并发场景下,如果某一个key被高并发的访问,缓存没有命中,出于容错性的考虑,会去数据库获取数据,从而导致大量请求访问数据库...

wuyiyi
3分钟前
0
0
eclipse 和idea 快捷键对照

分类 功能点 Eclipse快捷键 IDEA快捷键 搜索 搜索文本 Ctrl + F Ctrl + F Ctrl + R 查找替换 Alt + P/A 逐个/全部替换 Alt + F3 查找当前选中词 继续搜索 Ctrl + K 向前 Ctrl + Shift + K 向...

郭恩洲_OSC博客
3分钟前
0
0
PowerHA IP 替换方式与IP 别名方式的区别

IPAT via replacement (IP替换) The service IP label replaces the boot IP address on the interface. The heartbeat IP alias address remains. IPAT via aliasing (IP别名) The servic......

突突突酱
7分钟前
1
0
Kafka 几个重要的配置总结

注意:配置基于Kafka 0.8.2.1 broker配置 #非负整数,用于唯一标识broker broker.id 0 #kafka持久化数据存储的路径,可以指定多个,以逗号分隔 log.dirs /tmp/kafka-logs #broker接收连接请求...

hblt-j
8分钟前
0
0
开发函数计算的正确姿势 —— 排查超时问题

写不尽的 code,查不完的 bug 通常我们写 bug,哦,不对,写代码时总不会一帆风顺,往往各种 bug 充斥其中,即使测试有较高的代码覆盖率往往也会有漏网之鱼。能写出一些比较隐蔽或者看起来像...

阿里云官方博客
12分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部