2014-10-15 1 views
0

로컬 중첩 클래스에 래핑하여 직렬화를 속일 수 있다면 궁금합니다.로컬 직렬화 가능 클래스에 직렬화 할 수없는 클래스를 래핑 할 수 있습니까?

저는 전달해야하는 서비스가 있지만 내부적으로 매우 복잡한 데이터가 있습니다.

interface ComplexService { 
     IncredibleComplexObject getData(); 
    } 

그래서 저는 데코레이터 패턴을 통해 직렬화가 가능한 다른 클래스에 배치하는 것에 대해 생각합니다.

public final class Utils { 

    public static Serializable wrap(final ComplexService service) { 
     class WrapperService implements ComplexService, Serializeable { 
      @Override 
      public IncredibleComplexData getData() { 
       return service.getData(); 
      } 
     }; 
     return new WrapperService(); 
    } 
} 

실제로 자바는 실제로 내 마지막 ComplexService - 매개 변수에 따라 달라집니다 내 수업을 다시 할 수 있다면 조금 너무 많은 마법 것 때문에 나는, 그런 식으로 직렬화를 속일 수 있다고 생각하지 않습니다. 그러나 궁금한 점은 왜 이것이 정확히 실패하고 어떤 예외가 던져 질지, 왜 그리고 어디서입니다.


(그냥 내가 이렇게 할 이유를 해명 : 나는 안드로이드에와 나는 자연스럽게에만 serializeable 객체를 저장할 수있는 조각,이 서비스를 전달해야합니다).

+0

ComplexService를 직렬화 할 수 없습니까? 즉 Serializable을 확장 할 수 있습니까? – jamp

+0

'ComplexService' 자체는 직렬화 될 수 없습니다. 실제 구현은 필드에'IncredibleComplexObject'를 캐시하기 때문에 직렬화 할 수 없습니다. – Flo

+0

그리고 IncredibleComplexObject를 직렬화 할 수 없습니까? : P 어쨌든, WrapperService로 랩핑 한 후 어떻게 외부에서 getData()를 호출 할 수 있습니까? 그것은 내부 메서드 클래스입니다 ... – jamp

답변

1

예, 비 직렬화 가능 객체를 직렬화 가능 래퍼로 래핑 할 수 있습니다. 아니요, 래핑 된 객체를 마술처럼 직렬화 할 수는 없습니다. 래퍼 클래스를 직렬화하려고하면 해당 필드가 transient이되지 않고 NotSerializableException이됩니다.

+0

내 예제에서는 내 래퍼 클래스 실제로 필드가 없으므로 직렬화 여전히 작동하지만 deserialization 가능성이 예외가 발생할 것이라고 예상 할 것이라고, 내가 틀렸어? – Flo

+0

우스운 일, 방금 해봤 고 당신 말이 맞아요 - 비 직렬화 할 때 예외가 생기지 않습니다 - 이미 직렬화 할 때 예외가 생겼습니다. 어쨌든 내부 클래스를 직렬화하면 안되는 이유는 다음과 같습니다. http://stackoverflow.com/a/17805016/1406325 – Flo

관련 문제