Java 使用protostuff实现快速的对象深拷贝
首先protostuff是谷歌开源的一个序列化工具,比Java内部提供的序列化方式要快很多倍,然后深拷贝的时候特别是对于一个pojo我还要把它所有的参数都要写一遍?程序猿?码农?当然不会!所以我们考虑一下序列化吧。
事情的起因是对shiro操作的时候,服务层通过获取当前的登录用户信息进行返回
Subject subject = SecurityUtils.getSubject();
User user = (User) subject.getPrincipal();
return user;
控制层渲染的时候修改了用户信息
User info = userService.getUserInfo(id);
/**
* 设置返回数据隐私内容不显示
*
* ======================
*/
info.setPassword(null);
info.setUserState(null);
info.setCtime(null);
info.setNote(null);
info.setRoles(null);
info.setRid(null);
info.setState(null);
/**
* =====================
* */
result.setData(info);
return result.toString();
,然后后面用户再进行一个请求的时候,需要再读取
Subject subject = SecurityUtils.getSubject();
User user = (User) subject.getPrincipal();
好吧,这时候获取到的是修改过后的。
这样不行啊,我就需要把用户信息拷贝一个返回出来,代码如下:
public class User implements Cloneable, Serializable {
@Override
public User clone() {
User u = new User();
RuntimeSchema<User> schema = RuntimeSchema.createFrom(User.class);
byte[] bytes = ProtostuffIOUtil.toByteArray(this, schema, LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE));
ProtostuffIOUtil.mergeFrom(bytes, u, schema);
return u;
}
}
测试一下:
@Test
public void cloneTest() {
User user = new User();
user.setEmail("1234");
user.setNickname("nick");
user.setUid(1);
User u = user.clone();
User u1 = new User();
//System.identityHashCode()功能是获取对象的内存地址
logger.info(System.identityHashCode(u));
logger.info(System.identityHashCode(u1));
logger.info(System.identityHashCode(user));
Assert.assertEquals(user == u, false);
}

浙公网安备 33010602011771号