JAVA 深拷贝的几种方式

2020-06-23  本文已影响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());
}
上一篇下一篇

猜你喜欢

热点阅读