文档章节

java序列化和反序列化简单案例

shikaiJack
 shikaiJack
发布于 2016/08/14 16:37
字数 685
阅读 5
收藏 0
点赞 0
评论 0
public class XmlSerializer {
	
	@SuppressWarnings("rawtypes")
    //序列化
	public void serializer(File file,Object object){
		try {
			OutputStream os = new FileOutputStream(file);
			BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os, "utf-8"));
			bw.write("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
			if(object instanceof Collection){//判断是否为集合对象
				Class<?> clazz = object.getClass(); 
				bw.write(String.format("<Collection type=\"%s\">\n", clazz.getName()));
				Method method = clazz.getMethod("iterator");
				Iterator ite = (Iterator) method.invoke(object);
				while(ite.hasNext()){
					Object o = ite.next();
					bw.write(getObject(o));
					bw.newLine();
				}
				bw.write("</Collection>");
				
			}else{
				bw.write(getObject(object));//将对象序列化到指定的文件
			}
			bw.flush();
			bw.close();
			os.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
    //反序列化
	@SuppressWarnings({ "unchecked", "static-access" })
	public <T> T deserializer(File file,Class<?> clazz){
		SAXReader reader = new SAXReader();
		Document doc=null;
		T obj=null;
		try {
			doc = reader.read(file);
			obj = (T) clazz.newInstance();
			if(obj instanceof Collection){
				for(Iterator<Element> ite = doc.getRootElement().elementIterator();ite.hasNext();){
					Element element = ite.next();
					Class<?> itemClass = clazz.forName(element.attributeValue("type"));
					Object o = itemClass.newInstance();
					getDeserializer(element,o,itemClass);
					Method addMethod = clazz.getMethod("add",Object.class);
					addMethod.invoke(obj, o);//将对象添加到集合中
				}
			}else{
                //获取xml文件中标签的属性type的值
				Class<?> cla = clazz.forName(doc.getRootElement().attributeValue("type"));
				getDeserializer(doc.getRootElement(),obj,cla);
			}
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return obj;
		
	}
	@SuppressWarnings("unchecked")
    //获得单个对象的所有属性并未属性设置值
	private void getDeserializer(Element rootElement, Object object, Class<?> cla) {
		for(Iterator<Element> ite = rootElement.elementIterator();ite.hasNext();){
			Element ele = ite.next();
			try {
				Field field = cla.getDeclaredField(ele.getName());
				field.setAccessible(true);
				getField(field,object,ele.getText());
				
			} catch (NoSuchFieldException | SecurityException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
    //将值设置到属性中
	private void getField(Field field, Object object,String value) {
		Class<?> type = field.getType();
		try {
			if(type==int.class){				
				field.set(object, Integer.parseInt(value));				
			}else if(type==double.class){
				field.set(object, Double.parseDouble(value));		
			}else if(type==String.class){
				field.set(object, value);		
			}
		} catch (NumberFormatException  e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
    //将对象写入到xml中
	private String getObject(Object object) {
		Class<?> clazz = object.getClass();
		String string="";
		string += String.format("<%s type=\"%s\">\n", getSimpleName(clazz.getName()),clazz.getName());
		Field[] fields = clazz.getDeclaredFields();
		for(Field field:fields){
			field.setAccessible(true);
			try {
				string += String.format("\t<%s>%s</%s>\n", field.getName(),field.get(object),field.getName());
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		string += String.format("</%s>\n", getSimpleName(clazz.getName()));
		return string;
	}
    
	private String getSimpleName(String name) {
		// TODO Auto-generated method stub
		return name.substring(name.lastIndexOf(".")+1);
	}

}

 

public class Student {
	private String name;
	private int age;
	
	public Student(){}
	
	public Student(String name,int age){
		this.name=name;
		this.age=age;
	}
    //相应的get和set方法省略
}
public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		File file=new File("e:\\student.xml");
		XmlSerializer serializer=new XmlSerializer();
//		List<Student> students=new ArrayList<Student>();
//		students.add(new Student("张三",20) );
//		students.add(new Student("李四",22) );
//		Student stu = new Student("张三",20);
//		serializer.serializer(file, stu);
//		serializer.serializer(file, students);
//		Student stu=serializer.deserializer(file,Student.class);
//		stu.hello();
		List<Student> studentList=serializer.deserializer(file, ArrayList.class);
		for(Student student:studentList){
			student.hello();
		}
     }
}

 

© 著作权归作者所有

共有 人打赏支持
shikaiJack
粉丝 0
博文 1
码字总数 685
作品 0
长沙
Java序列化与JSON序列化大比拼

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

NoahX
2013/03/10
0
20
Android Serializable与Parcelable原理与区别

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

KingMing
2015/04/16
0
0
(1)java序列化--java.io.Serializable接口解析

(PS:本文为作者原著,如需转载,请注明出处-_^) 使用java以来,序列化随处可见,至于为什么要用序列化、序列化能解决什么问题,作为一个普通的码农,一般不怎么会去深入研究,由于最近在看...

sumekey
2011/09/07
0
0
Java序列化之Serializable

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

村长大神
05/08
0
0
Java反序列化漏洞的原理分析

  *本文原创作者:Moonlightos,本文属FreeBuf原创奖励计划,未经许可禁止转载   世界上有三件事最难:      把别人的钱装进自己的口袋里   把自己的想法装进别人的脑袋里   让自...

FreeBuf
05/04
0
0
Java序列化技术即将被废除!!!

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

Java技术栈
05/30
0
0
serialVersionUID作用

Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较...

stefanzhlg
2015/03/23
0
0
为什么我墙裂建议大家使用枚举来实现单例

我们知道,单例模式,一般有七种写法,那么这七种写法中,最好的是哪一种呢?为什么呢?本文就来抽丝剥茧一下。 哪种写单例的方式最好 在StakcOverflow中,有一个关于What is an efficient ...

冷_6986
06/13
0
0
为什么我墙裂建议大家使用枚举来实现单例。

关于单例模式,我的博客中有很多文章介绍过。作为23种设计模式中最为常用的设计模式,单例模式并没有想象的那么简单。因为在设计单例的时候要考虑很多问题,比如线程安全问题、序列化对单例的...

06/10
0
0
有效选择七个关于Java的JSON开源类库

April 4, 2014 By Constantin Marian Alin 翻译:无若 (英语原文:http://www.developer.com/lang/jscript/top-7-open-source-json-binding-providers-available-today.html) 简介 JSON是J......

无若
2014/04/19
0
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

idea tomcat 远程调试

tomcat 配置 编辑文件${tomcat_home}/bin/catalina.sh,在文件开头添加如下代码。    CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=7829" Idea端配......

qwfys
今天
1
0
遍历目录下的文件每250M打包一个文件

#!/usr/bin/env python # -*- utf-8 -*- # @Time : 2018/7/20 0020 下午 10:16 # @Author : 陈元 # @Email : abcmeabc@163.com # @file : tarFile.py import os import tarfile import thr......

寻爱的小草
今天
1
0
expect同步文件&expect指定host和要同步的文件&构建文件分发系统&批量远程执行命令

20.31 expect脚本同步文件 expect通过与rsync结合,可以在一台机器上把文件自动同步到多台机器上 编写脚本 [root@linux-5 ~]# cd /usr/local/sbin[root@linux-5 sbin]# vim 4.expect#!/...

影夜Linux
今天
1
0
SpringBoot | 第九章:Mybatis-plus的集成和使用

前言 本章节开始介绍数据访问方面的相关知识点。对于后端开发者而言,和数据库打交道是每天都在进行的,所以一个好用的ORM框架是很有必要的。目前,绝大部分公司都选择MyBatis框架作为底层数...

oKong
今天
12
0
win10 上安装解压版mysql

1.效果 2. 下载MySQL 压缩版 下载地址: https://downloads.mysql.com/archives/community/ 3. 配置 3.1 将下载的文件解压到合适的位置 我最终将myql文件 放在:D:\develop\mysql 最终放的位...

Lucky_Me
今天
2
0
linux服务器修改mtu值优化cpu

一、jumbo frames 相关 1、什么是jumbo frames Jumbo frames 是指比标准Ethernet Frames长的frame,即比1518/1522 bit大的frames,Jumbo frame的大小是每个设备厂商规定的,不属于IEEE标准;...

问题终结者
今天
1
0
expect脚本同步文件expect脚本指定host和要同步的文件 构建文件分发系统批量远程执行命令

expect脚本同步文件 在一台机器上把文件同步到多台机器上 自动同步文件 vim 4.expect [root@yong-01 sbin]# vim 4.expect#!/usr/bin/expectset passwd "20655739"spawn rsync -av ro...

lyy549745
今天
1
0
36.rsync下 日志 screen

10.32/10.33 rsync通过服务同步 10.34 linux系统日志 10.35 screen工具 10.32/10.33 rsync通过服务同步: rsync还可以通过服务的方式同步。那需要开启一个服务,他的架构是cs架构,客户端服务...

王鑫linux
今天
1
0
matplotlib 保存图片时的参数

简单绘图 import matplotlib.pyplot as pltplt.plot(range(10)) 保存为csv格式,放大后依然很清晰 plt.savefig('t1.svg') 普通保存放大后会有点模糊文件大小20多k plt.savefig('t5.p...

阿豪boy
今天
3
0
java 8 复合Lambda 表达式

comparator 比较器复合 //排序Comparator.comparing(Apple::getWeight);List<Apple> list = Stream.of(new Apple(1, "a"), new Apple(2, "b"), new Apple(3, "c")) .collect(......

Canaan_
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部