美文网首页
JAVA 深拷贝的几种方式

JAVA 深拷贝的几种方式

作者: _意义 | 来源:发表于2020-06-23 13:40 被阅读0次

    1.序列化方式

    public class JavaDeepCloneBySerialization {
    
    public static void main(String[] args) {
    
      Order order = new Order("12345", 100.45, "In Progress");
      Customer customer = new Customer("Test", "CUstomer", order);
    
      Customer cloneCustomer = deepClone(customer);
      order.setOrderStatus("Shipped");
      System.out.println(cloneCustomer.getOrder().getOrderStatus());
    
    }
    
    public static  T deepClone(T object){
      try {
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
            objectOutputStream.writeObject(object);
            ByteArrayInputStream bais = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
            ObjectInputStream objectInputStream = new ObjectInputStream(bais);
              return (T) objectInputStream.readObject();
        }
        catch (Exception e) {
          e.printStackTrace();
          return null;
        }
      }
    }
    

    2.Apache库SerializationUtils

    @Test
    public void whenModifyingOriginalObject_thenCommonsCloneShouldNotChange() {
        Address address = new Address("Downing St 10", "London", "England");
        User pm = new User("Prime", "Minister", address);
        User deepCopy = (User) SerializationUtils.clone(pm);
     
        address.setCountry("Great Britain");
     
        assertThat(deepCopy.getAddress().getCountry())
          .isNotEqualTo(pm.getAddress().getCountry());
    }
    

    3.JSON Serialization With Gson

    @Test
    public void whenModifyingOriginalObject_thenGsonCloneShouldNotChange() {
        Address address = new Address("Downing St 10", "London", "England");
        User pm = new User("Prime", "Minister", address);
        Gson gson = new Gson();
        User deepCopy = gson.fromJson(gson.toJson(pm), User.class);
     
        address.setCountry("Great Britain");
     
        assertThat(deepCopy.getAddress().getCountry())
          .isNotEqualTo(pm.getAddress().getCountry());
    }
    

    4.JSON Serialization With Jackson

    @Test
    public void whenModifyingOriginalObject_thenJacksonCopyShouldNotChange() 
      throws IOException {
        Address address = new Address("Downing St 10", "London", "England");
        User pm = new User("Prime", "Minister", address);
        ObjectMapper objectMapper = new ObjectMapper();
        User deepCopy = objectMapper
          .readValue(objectMapper.writeValueAsString(pm), User.class);
        address.setCountry("Great Britain");
       assertThat(deepCopy.getAddress().getCountry())
          .isNotEqualTo(pm.getAddress().getCountry());
    }
    

    相关文章

      网友评论

          本文标题:JAVA 深拷贝的几种方式

          本文链接:https://www.haomeiwen.com/subject/baicfktx.html