2013-09-07 4 views
0

은 내가 ObjectOutputStream을 통해 유형 ArrayList<Specific>인터페이스 항목이있는 인터페이스 모음을 사용하여 직렬화 할 수 있습니까?

public interface General extends Serializable { 
    ... 
} 

public class Specific implements General { 
    ... 
} 

내가 보낼 수 및 개체를 가지고 List<General>에 캐스팅하여 직렬화 가정? 그게 효과가 있니? 그렇지 않다면 어떻게해야합니까?

+4

왜 사용해 보지 않으시겠습니까? – arshajii

+0

어떤 특정 오류가 있습니까? –

답변

0

나는 그것을 스스로 시험해 보았지만 효과가 있다고 생각합니다. ArrayList.readObject()/writeObject()을보세요. writeObject()Specific 개체를 쓰고 readObject()Specific의 인스턴스로 다시 읽을 수 있어야하며 비 직렬화 목록의 각 요소는 General 참조이므로 확인해야합니다.

0

ArrayList는 제네릭 형식이 serializable 인 경우, javadoc (많은 Collection 클래스가 포함 된 개체 인 경우)에서 Serializable입니다. 직렬화 쪽이 작동합니다. 직렬화하고 다시 읽게됩니다. ArrayList 객체입니다.

iffy 캐스트입니다. 일반적으로 안전하지 않은 것으로 간주됩니다. 당신이

List<Specific> 

이 있다면 당신은 그들이 (런타임에, 그들이 진짜로 경우에도) 논리적으로 같은 것이 아니다

List<Generic> 

에 캐스팅 할 수 없습니다. 다음이 유효하기 때문에 사실, 프로그램 같은 직접적인 캐스트가 문제가 될 것입니다 :

List<Specific> specific = ...; 
List<Generic> generic = (List<Generic>) specific; 

generic.add(new OtherImplExtendingGeneric()); 
specific.get(specific.length() -1).methodOnlyOnSpecific(); // Kersplode 

하지만 당신은 객체로 취급하고, 당신이 다른 유형에 대한 다른 참조가없는, 그래서 해결할 것입니다. 그것은 당신이 그것을하는 것을 막지 않을 것입니다. 기술적으로 원하는 결과를 얻을 수 있습니다. 이유가 있을지 모르지만 코드 검토에서 눈을 부시게 만들 것입니다.

왜 제네릭 형식을 사용해야합니까?

+0

그래서 많은 클라이언트의 로그를 관리하는 로그 관리자가 생겼습니다. 모든 로그에는 로깅되는 항목에 관계없이 시작 및 종료 시간이 있습니다. 모든 로그에 대해'log.discardWhatsBefore (maximumLogStartTime)'과 같은 작업을 수행합니다.이 작업은 완전히 다를 수 있지만 모두'getStart()'및'getEndTime()'이라는 메서드를 포함합니다. 아이디어는 모든 로그의 교차점 만 얻는 것입니다. –

0

예 그것은 작동 : 제네릭 타입과 "정상"데이터 유형 사이

out.writeObject(list); 

List<General> list = (List<General>)in.readObject(); 

의 차이는 없습니다 런타임에 제네릭 컴파일러 만 볼 수 있다는 것입니다. 즉, 런타임에 List<A>List<B>이 동일하기 때문에 제네릭을 사용한 캐스트는 100 % 안전하지 않습니다.

그러나 목록에 General 목록이 있다고 확신하는 경우 여기에서 아무런 문제가 없습니다.

+0

위의,'General'의'List'가 확실히'Specific'의'ArrayList'라는 것을 알고있는 한, 작동 할 것입니다. 시원한! –

관련 문제