首页 > 代码库 > Java序列化全面解析
Java序列化全面解析
序列化是将对象状态转换为可保持或可传输的格式过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。序列化为一般文件或字节流,也序列化为XML文件(使用XStream)。
假设被序列化的类为Student,定义如下:
package com.tds; import java.io.Serializable; public class Student implements Serializable { /** * */ private static final long serialVersionUID = 1L; private Integer id; private String name; public Student(Integer id, String name) { this.id = id; this.name = name; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
序列化与反序列化的工具类如下:
package com.tds; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import com.thoughtworks.xstream.XStream; /** * 序列化的工具类 * @author Administrator * */ public class SerializableUtils { private static XStream xStream = new XStream(); /** * 把对象序列byte流 * @param obj * @return * @throws Exception */ public static <T> byte[] objectToByte(T obj) throws Exception { if (obj == null) { return null; } ByteArrayOutputStream byteArrayOs = new ByteArrayOutputStream(); ObjectOutputStream oOs = new ObjectOutputStream(byteArrayOs); oOs.writeObject(obj); return byteArrayOs.toByteArray(); } /** * 把对象从byte流中反序列化 * @param b * @return * @throws IOException */ @SuppressWarnings("unchecked") public static <T> T byteToObject(byte[] b) throws Exception { if (b == null || b.length == 0) { return null; } ByteArrayInputStream byteArrayIs = new ByteArrayInputStream(b); ObjectInputStream oIs = new ObjectInputStream(byteArrayIs); return (T)oIs.readObject(); } /** * 把对象序列化为xml * @param obj * @return */ public static <T> String objectToXml(T obj) { return xStream.toXML(obj); } /** * 把对象从xml反序更化为对象 * @param xml * @return */ @SuppressWarnings("unchecked") public static <T> T xmlToObject(String xml) { return (T)xStream.fromXML(xml); } }
在针对XStream序列化的时候,我们需要引入相关的jar包,下载地址如下:
http://xstream.codehaus.org/download.html ,添加相关的Jar包,即XStream.jar和xstream目标下所有jar包,当然有些jar包是多余的,相关的jar包如下:
package com.tds; public class Test { public static void main(String[] args) throws Exception { Student s1 = new Student(1, "张三"); byte[] b1 = SerializableUtils.objectToByte(s1); Student s2 = SerializableUtils.byteToObject(b1); System.out.println("s2: " + s2.getId() + " " + s2.getName()); String xml = SerializableUtils.objectToXml(s1); System.out.println(xml); Student s3 = SerializableUtils.xmlToObject(xml); System.out.println("s3: " + s3.getId() + " " + s3.getName()); } }运行结果如下:
s2: 1 张三
<com.tds.Student>
<id>1</id>
<name>张三</name>
</com.tds.Student>
s3: 1 张三
说明序列化与反序列化均是成功的
补充一下,java的序列化对transient变量是不起作用的,这也是transient的作用,如果Student类的id字段修改为transient,即修改为:
private transient Integer id;修改后的运行结果如下:
s2: null 张三
<com.tds.Student>
<name>张三</name>
</com.tds.Student>
s3: null 张三
这是我们发现,id字段确实没有被序列化;
Java序列化全面解析
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。