Java에서 목록을 직렬화하는 방법은 무엇입니까?


81

목록을 딥 복제하고 싶습니다. 이를 위해 우리는 방법이 있습니다

// apache commons method. This object should be serializable
SerializationUtils.clone ( object ) 

이제 내 목록을 복제하려면 먼저 직렬화 가능으로 변환해야합니다. 목록을 직렬화 가능 목록으로 변환 할 수 있습니까?

답변:


166

의 모든 표준 구현은 java.util.List이미 java.io.Serializable.

그래서 비록 java.util.List자체의 하위 유형 아니다 java.io.Serializable, 그것의 목록을 캐스팅하는 것이 안전해야 Serializable당신이 같은 표준 구현 중 하나 알고만큼, ArrayList또는 LinkedList.

확실하지 않은 경우 먼저 목록을 복사 (예 new ArrayList(myList):)하면 직렬화 가능하다는 것을 알 수 있습니다.


1
왜 누구든지 Serializable로 캐스트하고 싶어할까요? Serializable은 마커 인터페이스 일뿐입니다. Serializable로 무언가를 캐스팅하는 것은 유용하지 않습니다.
Jesper

19
때문에 SerializationUtils.clone()유형에 인수가 필요합니다 Serializable당신의 변수 유형 인 경우, 그래서, 그리고 List, 당신은 그것을 캐스팅해야합니다.
skaffman

2
@Jesper : 클래스를 직렬화하는 것이 안전하다고 말하는 마커 인터페이스입니다. Android는 여러 가지에 직렬화 가능 인터페이스를 사용합니다. 인 텐트 엑스트라, 공유 된 선호 사항 등 전달
Zack Marrapese

11
예, Android 솔루션을 검색 할 때이 질문을 찾았습니다. 내 추가입니다 List<MyClass> myObjs = new ArrayList<MyClass>();을 충족하지 않는 Serializable, 그러나 ArrayList<MyClass> myObjs = new ArrayList<MyClass>();않습니다.
Evi Song

2
@Adam 대신에 서명을 사용하여 컴파일 타임에 안전성을 보장하는 것이 가장 좋을 수 있습니다 <T extends List<Foo> & Serializable> setFooList(T list).이 경우 호출자가 Serializable 인 일부 List 구현의 인스턴스를 전달해야합니다.
Theodore Murdock 2015 년

32

이미 지적했듯이의 대부분의 표준 구현 List은 직렬화 가능합니다. 그러나 목록 내에서 참조 / 포함 된 개체 직렬화 할 수 있는지 확인해야합니다 .


1
이미 지적했듯이 List확장되지 않는 Serializable인터페이스 또는 확장되지 않는 인터페이스입니다. List직렬화 할 수없는 s는 표준 라이브러리에서 일반적이지 않을 수 있지만 첫 번째 문장이 올바른 것은 아닙니다.
arne.b 2012

14

목록 은 단순한 인터페이스입니다. 문제는 실제 목록 구현이 직렬화 가능합니까? Java 런타임 의 표준 List 구현 ( ArrayList , LinkedList ) 에 대해 말하면 대부분은 실제로 이미 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.