引言
为方便业务上不同应用之间数据传输。
1.JDK自带
@Test
public void jdkTest() throws Exception {
// 序列化
UserVO user = new UserVO();
user.setUserId("112");
user.setPassword("AKS");
FileOutputStream fos = new FileOutputStream(PATH + File.separator + "jdk.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(user);
// 反序列化
FileInputStream fis = new FileInputStream(PATH + File.separator + "jdk.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
UserVO us = (UserVO) ois.readObject();
LOGGER.info("jdkTest user {}", us);
}
2.JSON
@Test
public void jsonTest() {
UserVO user = new UserVO();
user.setUserId("112");
user.setPassword("AKS");
// 序列化
String json = JSON.toJSONString(user);
LOGGER.info("json {}", json);
// 反序列化
UserVO us = JSON.parseObject(json, UserVO.class);
LOGGER.info("us {}", us);
}
3.Hessian
@Test
public void hessianTest() throws Exception {
// 序列化
UserVO user = new UserVO();
user.setUserId("112");
user.setPassword("AKS");
ByteArrayOutputStream bos = new ByteArrayOutputStream();
Hessian2Output output = new Hessian2Output(bos);
output.writeObject(user);
output.close();
// 反序列化
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
Hessian2Input input = new Hessian2Input(bis);
UserVO us = (UserVO) input.readObject();
input.close();
LOGGER.info("jdkTest user {}", us);
}
注意事项:当父类和子类存在相同属性时,反序列化后子类的属性值会被父类覆盖。示例代码如下:
@Test
public void hessianExtendsAndSamePropertyTest() throws Exception {
// 序列化
MaleVO user = new MaleVO();
user.setUserId("112");
user.setPassword("AKS");
ByteArrayOutputStream bos = new ByteArrayOutputStream();
Hessian2Output output = new Hessian2Output(bos);
output.writeObject(user);
output.close();
// 反序列化
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
Hessian2Input input = new Hessian2Input(bis);
MaleVO us = (MaleVO) input.readObject();
input.close();
LOGGER.info("male {}", us);
}
//输出结果:
male MaleVO(super=UserVO(userId=null, password=AKS, date=null, roleVO=null), userId=null)
注意事项
1.如果某些变量不想被序列化,可以使用transient关键字修饰。
transient关键字的作用是:阻止实例中那些用此关键字修饰的的变量序列化;当对象被反序列化时,被transient修饰的变量值不会被持久化和恢复。transient只能修饰变量,不能修饰类和方法。