1. 程式人生 > >Java 使用protostuff實現快速的物件深拷貝

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);

    }