Java 使用protostuff实现快速的对象深拷贝

9人阅读 评论(0) 收藏 举报
分类:

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

    }
查看评论

用Delphi设计代理服务器[正确文章]

用Delphi设计自己的代理服务器    笔者在编写一个上网计费软件时,涉及到如何对局域网中各工作站上网计费问题。一般来讲,这些工作站通过代理服务器上网,而采用现成的代理服务器软件时,由于代理服务器软...
  • BExpress
  • BExpress
  • 2001-10-15 10:35:00
  • 1160

JAVA中使用redis+protoStuff实现数据库缓存机制

Redis介绍 redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zse...
  • m0_37770106
  • m0_37770106
  • 2017-05-01 12:38:40
  • 1320

ProtostuffUtil—快速序列化和反序列化对象工具

package cn.btkj.utils; import java.util.ArrayList; import java.util.List;   import com.dyuproject.p...
  • JiShuiSanQianLi
  • JiShuiSanQianLi
  • 2017-01-04 01:35:29
  • 2146

java 序列化实现对象的深拷贝

写java代码时,经常要实现对象的clone方法,处理对象的深拷贝问题。有一种简单的实现对象深拷贝的方法:将对象写入到字节流中,再读出来即可实现深拷贝。 @SuppressWarnings("unc...
  • sollian
  • sollian
  • 2016-06-20 11:35:56
  • 648

Java中实现深拷贝的方法—学习笔记

类实现Cloneable接口,然后用调用clone()方法,那么返回的只是一个浅拷贝的对象,基本属性的值是拷贝过来了而引用类型还是指向了被拷贝对象的引用类型。 方法一:类实现一个标记接口Seriali...
  • muyufenghua
  • muyufenghua
  • 2017-03-05 16:37:18
  • 911

Protostuff详解

Protostuff详解作者:chszs,未经博主允许不得转载。经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs一、Protostuff介绍Protostuff是...
  • chszs
  • chszs
  • 2016-01-04 17:13:47
  • 14851

通过Java的反射机制实现对象的拷贝

通过Java的反射机制实现对象的拷贝
  • hoho_12
  • hoho_12
  • 2016-11-02 10:44:51
  • 551

java提高篇(五)-----使用序列化实现对象的拷贝

我们知道在Java中存在这个接口Cloneable,实现该接口的类都会具备被拷贝的能力,同时拷贝是在内存中进行,在性能方面比我们直接通过new生成对象来的快,特别是在大对象的生成上,使得性能的提升非常...
  • chenssy
  • chenssy
  • 2013-10-22 19:15:06
  • 17620

使用Protostuff序列化及反序列化优化调试

在写自动化工具的时候经常遇到一个问题,工具前面历经坎坷做完了很多事情,但是在最后一步出错了,修改完之后要进行验证,你可能需要又重走一遍之前的步骤来拿到出现问题的场景,不得不说,这时候感觉很坑爹…… ...
  • Anlegor
  • Anlegor
  • 2015-06-26 20:22:10
  • 7781

java对象的浅拷贝和深拷贝

我们知道,每个对象都有拷贝其对象的能力,是因为每个对象都是一个Object子类,而Object提供clone方法,一个类实现了Cloneable接口就表示该类具备了被拷贝的能力,如果再覆写里面的clo...
  • HarderXin
  • HarderXin
  • 2014-12-03 12:02:14
  • 1667
    个人资料
    持之以恒
    等级:
    访问量: 2万+
    积分: 477
    排名: 10万+
    最新评论