Java使用序列化流实现对List泛型的深拷贝

使用序列化流实现对List泛型的深拷贝

深拷贝

  • 为新的对象重新开辟一个内存空间,拷贝原有对象的数据结构和值;新的对象的值修改不会涉及原对象的值(请注意性能问题)。

实现序列化拷贝的前提条件

  • 实体对象实现Serializable接口

    /**
     * 用户实体类
     */
    public class UserEntity implements Serializable {
    
        private int id;
    
        private String username;
    
        private String sex;
    
        private int age;
    
        private String address;
    
        private String birthday;
    
        //get、set方法省略
    	
        public UserEntity(int id, String username, String sex, int age, String address) {
            this.id = id;
            this.username = username;
            this.sex = sex;
            this.age = age;
            this.address = address;
        }
    
        @Override
        public String toString() {
            return "UserEntity{" +
                    "id=" + id +
                    ", username='" + username + '\'' +
                    ", sex='" + sex + '\'' +
                    ", age=" + age +
                    ", address='" + address + '\'' +
                    '}';
        }
    }
    

序列化拷贝方法

  • private static final Logger LOGGER = LoggerFactory.getLogger(DeepCopyDemo.class);
    
    public static <T> List<T> deepCopy(List<T> list) {
            //判断是否实现序列化
            if (list instanceof Serializable){
                ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
                try {
                    ObjectOutputStream out = new ObjectOutputStream(byteOut);
                    out.writeObject(list);
    
                    ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
                    ObjectInputStream inStream = new ObjectInputStream(byteIn);
                    List<T> ts = (List<T>) inStream.readObject();
                    return ts;
                } catch (Exception e) {
                    LOGGER.error("序列化Copy失败", e);
                    e.printStackTrace();
                }
            }
            return null;
        }
    

序列化拷贝测试

  • public static Integer INDEX  = 0;
    
        public static void main(String[] args) {
            UserEntity userEntity1 = new UserEntity(0, "张无忌","女",1 , "beijignshi");
            UserEntity userEntity2 = new UserEntity(1, "李寻欢","女",4 , "tianjinshi");
            UserEntity userEntity3 = new UserEntity(3, "项羽","男",0 , "chuguo");
            UserEntity userEntity4 = new UserEntity(4, "刘邦","男",8 , "hanchao");
    
            List<UserEntity> list = new ArrayList<>();
            list.add(userEntity2);
            list.add(userEntity1);
            list.add(userEntity4);
            list.add(userEntity3);
    
            System.out.println("----deep copy front----");
            for (UserEntity userEntity: list) {
                System.out.println(userEntity.toString());
            }
    
            List<UserEntity> copyResult = deepCopy(list);
            System.out.println("----deep copy after----");
            copyResult.get(INDEX).setUsername("夷陵老祖");
            for (UserEntity userEntity: copyResult) {
                System.out.println(userEntity.toString());
            }
    
        }
    

拷贝结果

  • ----deep copy front----
    UserEntity{id=1, username='李寻欢', sex='女', age=4, address='tianjinshi'}
    UserEntity{id=0, username='张无忌', sex='女', age=1, address='beijignshi'}
    UserEntity{id=4, username='刘邦', sex='男', age=8, address='hanchao'}
    UserEntity{id=3, username='项羽', sex='男', age=0, address='chuguo'}
    ----deep copy after----
    UserEntity{id=1, username='夷陵老祖', sex='女', age=4, address='tianjinshi'}
    UserEntity{id=0, username='张无忌', sex='女', age=1, address='beijignshi'}
    UserEntity{id=4, username='刘邦', sex='男', age=8, address='hanchao'}
    UserEntity{id=3, username='项羽', sex='男', age=0, address='chuguo'}
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java使用fastjson进行泛型类的反序列化,你可以按照以下步骤进行操作: 首先,确保你已经引入了fastjson的依赖,可以通过Maven等构建工具添加以下依赖项: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.79</version> </dependency> ``` 接下来,假设你有一个泛型类`Result<T>`,如下所示: ```java import com.alibaba.fastjson.JSON; public class Result<T> { private int code; private String message; private T data; public Result(int code, String message, T data) { this.code = code; this.message = message; this.data = data; } public int getCode() { return code; } public String getMessage() { return message; } public T getData() { return data; } public static <T> Result<T> fromJson(String json, Class<T> clazz) { return JSON.parseObject(json, new TypeReference<Result<T>>(clazz) {}.getType()); } } ``` 在上述代码中,`fromJSON`方法使用fastjson的`parseObject`方法将JSON字符串反序列化为`Result<T>`对象。 然后,你可以使用以下代码将JSON字符串反序列化为具体的泛型类对象: ```java import com.alibaba.fastjson.JSON; public class Main { public static void main(String[] args) { String json = "{\"code\":200,\"message\":\"Success\",\"data\":{\"name\":\"John\",\"age\":25}}"; Result<User> result = Result.fromJson(json, User.class); System.out.println("Code: " + result.getCode()); System.out.println("Message: " + result.getMessage()); User user = result.getData(); System.out.println("Name: " + user.getName()); System.out.println("Age: " + user.getAge()); } } ``` 在上述代码中,我们将一个包含`User`对象的JSON字符串反序列化为`Result<User>`对象,并输出其中的字段值。 请注意,为了正确反序列化泛型类,我们需要通过传递`Class<T>`参数给`fromJSON`方法来指定具体的泛型类型。 以上就是使用fastjson进行泛型类反序列化的基本示例。当然,根据实际需求和数据结构的复杂程度,你可能需要进行更多的定制和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值