java对象序列化与反序列化
来源:互联网 发布:上海德颐网络正规吗 编辑:程序博客网 时间:2024/05/21 09:25
无论何种数据在网络上传输,都必须要转化为二进制流,因此将一个对象由发送方通过网络传输给接收方,发送方需要将对象序列化为二进制流,接收方在接收到数据后,反序列化为对象。
- 将对象转化为二进制流的过程为对象的序列化
将二进制流恢复为对象的过程为对象的反序列化
对象的序列化与反序列化有多种成熟的解决方案,java语言支持的比较常用的有如下几种方式:java本身内置的序列化方式
- Hessian
- Json
XML
java内置的序列化方式,不需要引入第三方jar,使用比较简单,在效率要求不是很敏感的场景下,是一个不错的选择,Hessian方式要比java自带的序列化xiaolv高的多,且对各种语言有着良好的支持,性能稳定,JSON和XML格式,在互联网领域,尤其是在移动互联网领域,得益于其跨平台的特性,得到了极为广泛的引用。java本身内置的序列化方式
package com.serializable.java;import java.io.Serializable;/** * java将对象进行序列化,必须要实现serializable接口 * @author Administrator * */public class Person implements Serializable{ private String id; private String name; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String toString(){ return "ID:"+this.id+",姓名:"+this.name; }}
package com.serializable.java;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;public class JavaSerializableTest { public static void main(String[] args) throws Exception { Person person = new Person(); person.setId("001"); person.setName("小强"); byte[] bytes = objToByte(person); Person p = byteToObj(bytes); System.out.println(p); } //将java对象序列化为字节数组 public static byte[] objToByte(Person person) throws IOException{ //定义一个字节输出流 ByteArrayOutputStream os = new ByteArrayOutputStream(); //定义对象输出流 ObjectOutputStream out = new ObjectOutputStream(os); //将对象写入字节数组中,进行序列化 out.writeObject(person); return os.toByteArray(); } //将字节数组反序列化为java对象 public static Person byteToObj(byte[] bytes) throws IOException, ClassNotFoundException{ //定义字节输入流 ByteArrayInputStream ins = new ByteArrayInputStream(bytes); //定义对象输入流,执行反序列化,从流中读取对象 ObjectInputStream input = new ObjectInputStream(ins); Person person = (Person) input.readObject(); return person; }}
- Hessian
package com.serializable.hessian;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import com.caucho.hessian.io.Hessian2Input;import com.caucho.hessian.io.Hessian2Output;/** * 必须在对象序列化完成后,关闭流 * 否则,在进行反序列化时,抛出如下异常 * Exception in thread "main" java.io.EOFException: readObject: unexpected end of file at com.caucho.hessian.io.Hessian2Input.readObject(Hessian2Input.java:2133) at com.serializable.hessian.HessianSerializableTest.bytesToObj(HessianSerializableTest.java:34) at com.serializable.hessian.HessianSerializableTest.main(HessianSerializableTest.java:17) * @author Administrator * */public class HessianSerializableTest { public static void main(String[] args) throws IOException { Person person = new Person(); person.setId("002"); person.setName("小强二号"); byte[] bytes = objToBytes(person); Person p = bytesToObj(bytes); System.out.println(p); } //使用Hessian序列化工具,将java对象,序列化为字节数组 public static byte[] objToBytes(Person person) throws IOException{ ByteArrayOutputStream os = new ByteArrayOutputStream(); //Hession的序列化输出 Hessian2Output out = new Hessian2Output(os); out.writeObject(person); out.close(); return os.toByteArray(); } //将字节数组反序列化为java对象 public static Person bytesToObj(byte[] bytes) throws IOException{ ByteArrayInputStream ins = new ByteArrayInputStream(bytes); Hessian2Input input = new Hessian2Input(ins); Person person = (Person) input.readObject(); return person; }}
- JSON
package com.serializable.json;import java.io.IOException;import java.io.StringWriter;import org.codehaus.jackson.JsonFactory;import org.codehaus.jackson.JsonGenerator;import org.codehaus.jackson.map.ObjectMapper;public class JsonTest { public static void main(String[] args) throws IOException { Person person = new Person(); person.setId("003");; person.setName("小强三号"); String personJson = objToJson(person); System.out.println(personJson); Person p = jsonToObj(personJson); System.out.println(p); } //将对象序列化为json字符串 public static String objToJson(Person person) throws IOException{ ObjectMapper mapper = new ObjectMapper(); StringWriter sw = new StringWriter(); JsonGenerator jgen = new JsonFactory().createJsonGenerator(sw); mapper.writeValue(jgen, person); jgen.close(); return sw.toString(); } //将json字符串反序列化为java对象 public static Person jsonToObj(String personJson) throws IOException{ ObjectMapper mapper = new ObjectMapper(); StringWriter sw = new StringWriter(); JsonGenerator jgen = new JsonFactory().createJsonGenerator(sw); return mapper.readValue(personJson, Person.class); }}
- XML
package com.serializable.xml;import com.thoughtworks.xstream.XStream;import com.thoughtworks.xstream.io.xml.DomDriver;public class XMLTest { public static void main(String[] args) { Person person = new Person(); person.setId("004"); person.setName("小强四号"); String personXml = objToXml(person); System.out.println(personXml); person = xmlToObj(personXml); System.out.println(person); } //将对象序列化为xml public static String objToXml(Person person){ XStream xStream = new XStream(new DomDriver()); //设置person类的别名 xStream.alias("person", Person.class); String personXml = xStream.toXML(person); return personXml; } //将xml反序列化为java对象 public static Person xmlToObj(String personXml){ XStream xStream = new XStream(new DomDriver()); //在反序列化时,没有设置别名将抛出如下异常 // com.thoughtworks.xstream.mapper.CannotResolveClassException: xStream.alias("person", Person.class); return (Person) xStream.fromXML(personXml); }}
Hessian: hessian-4.0.7.jar
JSON:jackson-all-1.9.2.jar
XML:xstream-1.4.8.jar
0 0
- Java 对象的序列化与反序列化实践
- JAVA对象序列化与反序列化
- Java对象的序列化与反序列化
- java笔记九:对象序列化与反序列化
- Java之对象序列化与反序列化
- Java 对象序列化与反序列化知识点汇总
- Java对象的序列化与反序列化
- java对象序列化与反序列化
- Java对象的序列化与反序列化
- java对象序列化与反序列化总结
- 【Java】对象的序列化与反序列化
- java对象的序列化与反序列化
- java对象序列化与反序列化
- Java对象的序列化与反序列化
- Java对象的序列化与反序列化
- Java对象数组序列化与反序列化
- Java对象的序列化与反序列化
- Java对象的序列化与反序列化
- 乐观锁 悲观锁
- Shiro 设置session超时时间
- 刷题总结#8
- A-Frame WebVR开发入门教程
- 二叉树深度
- java对象序列化与反序列化
- css基础一(权重)
- Redis 学习笔记3:Jedis 连接虚拟机下的Redis 服务
- QiYuAdmin-部门增删改查
- 石头匠人的个人博客
- 蓝桥 还款计算
- Poj1847(floyd)
- spring MVC 传入 json 数组
- shell学习笔记(二):shell 语法