0、前言
本文主要对几种常见Java序列化方式进行实现。包括Java原生以流的方法进行的序列化、Json序列化、FastJson序列化、Protobuff序列化。
1、Java原生序列化
Java原生序列化方法即通过Java原生流(InputStream和OutputStream之间的转化)的方式进行转化。需要注意的是JavaBean实体类必须实现Serializable接口,否则无法序列化。Java原生序列化代码示例如下所示:
package serialize; import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.ArrayList; import java.util.List; /** * * @author liqqc * */ public class JavaSerialize { public static void main(String[] args) throws ClassNotFoundException, IOException { new JavaSerialize().start(); } public void start() throws IOException, ClassNotFoundException { User u = new User(); List<User> friends = new ArrayList<>(); u.setUserName("张三"); u.setPassWord("123456"); u.setUserInfo("张三是一个很牛逼的人"); u.setFriends(friends); User f1 = new User(); f1.setUserName("李四"); f1.setPassWord("123456"); f1.setUserInfo("李四是一个很牛逼的人"); User f2 = new User(); f2.setUserName("王五"); f2.setPassWord("123456"); f2.setUserInfo("王五是一个很牛逼的人"); friends.add(f1); friends.add(f2); Long t1 = System.currentTimeMillis(); ByteArrayOutputStream out = new ByteArrayOutputStream(); ObjectOutputStream obj = new ObjectOutputStream(out); for(int i = 0; i<10; i++) { obj.writeObject(u); } System.out.println("java serialize: " +(System.currentTimeMillis() - t1) + "ms; 总大小:" + out.toByteArray().length ); Long t2 = System.currentTimeMillis(); ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(new java.io.ByteArrayInputStream(out.toByteArray()))); User user = (User) ois.readObject(); System.out.println("java deserialize: " + (System.currentTimeMillis() - t2) + "ms; User: " + user); } }</div>
运行结果:
java serialize: 8ms; 总大小:420
java deserialize: 1ms; User: User [userId=null, userName=张三, passWord=123456, userInfo=张三是一个很牛逼的人, friends=[User [userId=null, userName=李四, passWord=123456, userInfo=李四是一个很牛逼的人, friends=null], User [userId=null, userName=王五, passWord=123456, userInfo=王五是一个很牛逼的人, friends=null]]]
</div>
2、Json序列化
Json序列化一般会使用jackson包,通过ObjectMapper类来进行一些操作,比如将对象转化为byte数组或者将json串转化为对象。现在的大多数公司都将json作为服务器端返回的数据格式。比如调用一个服务器接口,通常的请求为xxx.json?a=xxx&b=xxx的形式。Json序列化示例代码如下所示:
package serialize; import java.io.IOException; import java.util.ArrayList; import java.util.List; import com.fasterxml.jackson.databind.ObjectMapper; /** * * @author liqqc * */ public class JsonSerialize { public static void main(String[] args) throws IOException { new JsonSerialize().start(); } public void start() throws IOException { User u = new User(); List<User> friends = new ArrayList<>(); u.setUserName("张三"); u.setPassWord("123456"); u.setUserInfo("张三是一个很牛逼的人"); u.setFriends(friends); User f1 = new User(); f1.setUserName("李四"); f1.setPassWord("123456"); f1.setUserInfo("李四是一个很牛逼的人"); User f2 = new User(); f2.setUserName("王五"); f2.setPassWord("123456"); f2.setUserInfo("王五是一个很牛逼的人"); friends.add(f1); friends.add(f2); ObjectMapper mapper = new ObjectMapper(); Long t1 = System.currentTimeMillis(); byte[] writeValueAsBytes = null; for (int i = 0; i < 10; i++) { writeValueAsBytes = mapper.writeValueAsBytes(u); } System.out.println("json serialize: " + (System.currentTimeMillis() - t1) + "ms; 总大小:" + writeValueAsBytes.length); Long t2 = System.currentTimeMillis(); User user = mapper.readValue(writeValueAsBytes, User.class); System.out.println("json deserialize: " + (System.currentTimeMillis() - t2) + "ms; User: " + user); } }</div>
运行结果:
json serialize: 55ms; 总大小:341
json deserialize: 35ms; User: User [userId=null, userName=张三, passWord=123456, userInfo=张三是一个很牛逼的人, friends=[User [userId=null, userName=李四, passWord=123456, userInfo=李四是一个很牛逼的人, friends=null], User [userId=null, userName=王五, passWord=123456, userInfo=王五是一个很牛逼的人, friends=null]]]
</div>
3、FastJson序列化
fastjson 是由阿里巴巴开发的一个性能很好的Java 语言实现的 Json解析器和生成器。特点:速度快,测试表明fastjson具有极快的性能,超越任其他的Java json parser。功能强大,完全支持java bean、集合、Map、日期、Enum,支持范型和自省。无依赖,能够直接运行在Java SE 5.0以上版本
支持Android。使用时候需引入FastJson第三方jar包。FastJson序列化代码示例如下所示:
package serialize; import java.util.ArrayList; import java.util.List; import com.alibaba.fastjson.JSON; /** * * @author liqqc * */ public class FastJsonSerialize { public static void main(String[] args) { new FastJsonSerialize().start(); } public void start(){ User u = new User(); List<User> friends = new ArrayList<>(); u.setUserName("张三"); u.setPassWord("123456"); u.setUserInfo("张三是一个很牛逼的人"); u.setFriends(friends); User f1 = new User(); f1.setUserName("李四"); f1.setPassWord("123456"); f1.setUserInfo("李四是一个很牛逼的人"); User f2 = new User(); f2.setUserName("王五"); f2.setPassWord("123456"); f2.setUserInfo("王五是一个很牛逼的人"); friends.add(f1); friends.add(f2); //序列化 Long t1 = System.currentTimeMillis(); String text = null; for(int i = 0; i<10; i++) { text = JSON.toJSONString(u); } System.out.println("fastJson serialize: " +(System.currentTimeMillis() - t1) + "ms; 总大小:" + text.getBytes().length); //反序列化 Long t2 = System.currentTimeMillis(); User user = JSON.parseObject(text, User.class); System.out.println("fastJson serialize: " + (System.currentTimeMillis() -t2) + "ms; User: " + user); } }</div>
运行结果:
fastJson serialize: 284ms; 总大小:269
fastJson serialize: 26ms; User: User [userId=null, userName=张三, passWord=123456, userInfo=张三是一个很牛逼的人, friends=[User [userId=null, userName=李四, passWord=123456, userInfo=李四是一个很牛逼的人, friends=null], User [userId=null, userName=王五, passWord=123456, userInfo=王五是一个很牛逼的人, friends=null]]]
</div>