先创建一个user 实体类做测试
public class User implements Serializable { // private static final long serialVersionUID = -1568730003971173026L; // @Protobuf(fieldType = FieldType.INT32) private Integer userId; // @Protobuf(fieldType = FieldType.STRING) private String userName; // @Protobuf(fieldType = FieldType.DATE) private Date userBirth; public Date getUserBirth() { return userBirth; } public void setUserBirth(Date userBirth) { this.userBirth = userBirth; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public Integer getUserId() { return userId; } public void setUserId(Integer userId) { this.userId = userId; } @Override public String toString() { return "User{" + "userId=" + userId + ", userName='" + userName + '\'' + ", userBirth=" + userBirth + '}'; }
一、Java 自己带的序列化工具
---序列化方法
public static void serialize() throws IOException { User user = new User(); user.setUserId(1); user.setUserName("序列化"); user.setUserBirth(new Date()); ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("user")); oos.writeObject(user); oos.flush(); oos.close(); }
---反序列化方法
public static void deserialize() throws IOException, ClassNotFoundException { ObjectInputStream ois = new ObjectInputStream(new FileInputStream("user")); User user = (User) ois.readObject(); System.out.println(user.getUserName()); }
// 调用 方法
public static void main(String[] args) throws IOException, ClassNotFoundException { serialize(); deserialize(); }
如果同一个文件再序列化一次的话 文件的大小是不会翻倍,只会在文件写入Header的信息
二、json 序列化
User user = new User(); user.setUserId(10001); user.setUserName("序列化first"); user.setUserBirth(new Date()); byte[] bytes = null; long start = System.currentTimeMillis(); // 序列化 ObjectMapper objectMapper = new ObjectMapper(); for (int i = 0 ; i< 10000 ;i++){ bytes = objectMapper.writeValueAsBytes(user); } long end = System.currentTimeMillis(); System.out.println("消耗时间:"+ (end - start) +"ms" ); System.out.println(bytes.length); // 反序列化 User user1 = objectMapper.readValue(bytes, User.class); System.out.println(user1);
三、Gson 序列化 (消耗时间:131ms,文件大小 :82 字節)
User user = new User(); user.setUserId(10001); user.setUserName("序列化first"); user.setUserBirth(new Date()); long start = System.currentTimeMillis(); String text = ""; Gson gson = new Gson(); // 序列化 for (int i = 0 ; i< 10000 ;i++){ text = gson.toJson(user); } long end = System.currentTimeMillis(); System.out.println("消耗时间:"+ (end - start) +"ms" ); System.out.println(text.getBytes().length); // 反序列化 User user1 = gson.fromJson(text, User.class); System.out.println(user1);
四、Fastjson(消耗时间:97ms ,文件大小 :70 字节)
User user = new User(); user.setUserId(10001); user.setUserName("序列化first"); user.setUserBirth(new Date()); byte[] bytes = null; long start = System.currentTimeMillis(); // 序列化 String text = null; for (int i = 0 ; i< 10000 ;i++){ text = JSON.toJSONString(user); } long end = System.currentTimeMillis(); System.out.println("消耗时间:"+ (end - start) +"ms" ); System.out.println(text.getBytes().length); // 反序列化 User user1 = JSON.parseObject(text, User.class); System.out.println(user1);
五、百度的--ProtoBuff(消耗时间:484ms,文件大小:26)
注意:使用这个的时候 user 实体类需要加上 @Protobuf ,
User user = new User(); user.setUserId(10001); user.setUserName("序列化first"); user.setUserBirth(new Date()); long start = System.currentTimeMillis(); byte[] encode = null; Gson gson = new Gson(); Codec<User> userCodec = ProtobufProxy.create(User.class); // 序列化 for (int i = 0 ; i< 10000 ;i++){ encode = userCodec.encode(user); } long end = System.currentTimeMillis(); System.out.println("消耗时间:"+ (end - start) +"ms" ); System.out.println(encode.length); // 反序列化 User decode = userCodec.decode(encode); System.out.println(decode);
六、Kryo (消耗时间:99ms,文件大小:243)
注意: 原来的旧版本不需要,但是新版本 需要加上 这行进行注册, kryo.register(User.class, new JavaSerializer());
不然会有报错信息 :
java.lang.IllegalArgumentException: Class is not registered: org.example.nativenal.domian.User
Note: To register this class use: kryo.register(org.example.nativenal.domian.User.class);
User user = new User(); user.setUserId(10001); user.setUserName("序列化first"); // user.setUserBirth(new Date()); long start = System.currentTimeMillis(); Kryo kryo = new Kryo(); kryo.register(User.class, new JavaSerializer()); Output output = null; output = new Output(new FileOutputStream("kryo")); kryo.writeObject(output, user); long end = System.currentTimeMillis(); System.out.println("消耗时间:"+ (end - start) +"ms" ); System.out.println(new File("kryo").length()); // 反序列化 Input Input = new Input(new FileInputStream("kryo")); User user1 = kryo.readObject(Input, User.class); System.out.println(user1);
在网络传输中文件越小传输的速度越快