Android 深度拷贝

2024-07-03 822点热度 0条评论

Android开发中,序列化,反序列化的使用是非常平凡的。通常使用JSON的序列化特性来做,但也可以使用Parcelable接口的特性来实现!

public class CloneUtils {

	private static final Gson gson = new GsonBuilder().registerTypeAdapter(Integer.class, new SapIntegerDeserializer())
			.registerTypeAdapter(Double.class, new SapDoubleDeserializer())
			.create();

	/**
	 * 使用Gson进行对象的深度克隆
	 *
	 * @param source 要克隆的对象
	 * @param clazz  对象的类型
	 * @param <T>    泛型类型
	 * @return 克隆后的新对象
	 */
	public static <T> T deepClone(T source, Class<T> clazz) {
		String json = gson.toJson(source);
		return gson.fromJson(json, clazz);
	}

	/**
	 * 深度拷贝
	 *
	 * @param original 原始对象
	 * @param <T>      泛型
	 * @return 克隆对象
	 */
	public static <T extends Parcelable> T deepCopy(T original) {
		if (null == original) {
			return null;
		}
		Parcel parcel = Parcel.obtain();

		try {
			parcel.writeParcelable(original, 0);
			parcel.setDataPosition(0);
			return parcel.readParcelable(original.getClass()
					.getClassLoader());
		} finally {
			parcel.recycle();
		}
	}

	/**
	 * 深度拷贝
	 *
	 * @param original 需拷贝的原始集合
	 * @param <T>      泛型
	 * @return 克隆对象
	 */
	public static <T extends Parcelable> List<T> deepCopy(List<T> original) {
		if (null == original) {
			return null;
		}

		return original.stream()
				.map(CloneUtils::deepCopy)
				.collect(Collectors.toList());
	}
}

Jalena

原创内容,转载请注明出处! 部分内容来自网络,请遵守法律适用!

文章评论