简介
Java序列化是指把Java对象转换为字节序列的过程;而Java反序列化是指把字节序列恢复为Java对象的过程。从而达到网络传输、本地存储的效果。
序列化Serializable
实现Serializable接口,会自动将非transient修饰的变量序列化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| package org.serial;
import java.io.Serializable;
public class User implements Serializable {
private static final long serialVersionUID = -184170424740238078L;
private String name; private String sex;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getSex() { return sex; }
public void setSex(String sex) { this.sex = sex; } }
|
测试类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| package org.serial;
import java.io.*;
public class SerializableUtil {
public static Object deserializable(byte[] bytes) { try (ObjectInputStream objectInputStream = new ObjectInputStream(new ByteArrayInputStream(bytes))) { Object o = objectInputStream.readObject(); return o; } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return null; }
public static byte[] serializable(Object obj) { try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);) { objectOutputStream.writeObject(obj); return byteArrayOutputStream.toByteArray(); } catch (IOException e) { e.printStackTrace(); } return null; }
public static void main(String[] args) { User user = new User(); user.setName("zhang"); user.setSex("man");
byte[] serializable = SerializableUtil.serializable(user); User deserializable = (User)SerializableUtil.deserializable(serializable); System.out.println(deserializable.toString()); } }
|
Externalizable
实现Externalizable
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| package org.serial;
import java.io.Externalizable; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput;
public class Car implements Externalizable { private String name; private String color;
@Override public void writeExternal(ObjectOutput objectOutput) throws IOException { objectOutput.writeObject(name); objectOutput.writeObject(color); }
@Override public void readExternal(ObjectInput objectInput) throws IOException, ClassNotFoundException { String name = (String) objectInput.readObject(); String color = (String) objectInput.readObject(); }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getColor() { return color; }
public void setColor(String color) { this.color = color; } }
|
注意
Externalizable接口实现方式一定要有默认的无参构造函数
Externalizable不需要产生序列化ID而Serializable需要
相比较Serializable,Externalizable序列化、反序列更加快速,占用相比较小的内存