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
原创粉丝点击