amoxu

amoxu学习记录以及分享

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

    }
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mistyrain0109/article/details/79980591
个人分类: JAVA
上一篇Mysql 存储过程批量插入数据出错:Cannot add or update a child row: a foreign key constraint fails
下一篇一条关于评论查询并且用户是否点赞的SQL语句
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭