Java 使用protostuff實現快速的物件深拷貝
阿新 • • 發佈:2019-01-29
首先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);
}