2010-12-27 8 views
3

일부 응용 프로그램을 유지하고 있는데 Serializable으로 표시된 클래스가 있지만 어디에도 직렬화되지 않았으므로 Serializable 마크가 필요하지 않습니다.일련 번호 찾기 사용

가장 확실한 방법은 무엇입니까? 이것을 정적으로 결정할 수 있습니까?

감사합니다.

+1

''implements Serializable '을 제거하고 컴파일되고 실행되는지 확인할 수 있습니까? 나는 그것이 필요한 경우 컴파일하지 않을 것이라고 생각합니다. – marcog

+3

@marcog, 그건 사실이 아닙니다. 코드를 컴파일 한 다음 런타임 오류가 발생하여 일련의 내용을 직렬화 할 수 없습니다. –

답변

3

직접적으로 아닙니다. 일반적으로 직렬화는 객체가 ObjectOutputStream에 기록 될 때 발생하지만, 대부분이 코드 외부에서 발생합니다 (예 : 사용중인 라이브러리 또는 컨테이너에서). 따라서 두 가지 옵션이 있습니다.

  • 동적으로이 클래스를 클래스에 정의하십시오. 따라서 어떤 기능을 손상시키지 않고 클래스가 직렬화되고 있는지를 최종적으로 알 수 있습니다. 하지만 당신은 시스템이 실행해야 할 것 : 개체가 어디로 가는지 이해하기

    private void writeObject(java.io.ObjectOutputStream out) { 
        out.defaultWriteObject(); 
        log.info("Object of type " + 
         getClass().getName() + " is being serialized"); 
        // optionally include a stacktrace here, or use a debugger, to see 
        // when exactly it happened 
    } 
    
  • 시도. 네트워크를 통해 전송되거나 임시 저장 장치 (세션, 캐시)에 저장되는 경우 Serializable이어야합니다. 그렇지 않으면, 아마, 아마. ,이 등 당신이 할 수있다

    , 반사에 의해 사용할 수있는 개체는 제네릭이 아닌 컬렉션의 일부가 될 수 있습니다 -

1

나는 그것이 적어도 아주 열심히, 정적으로 결정하는 것은 불가능하다고 생각 객체의 직렬화/직렬화 복원시에 jvm에 의해 불려가는 객체의 readResolve() 및 writeReplace() 메소드에, 일부의 로그/디버그 코드를 넣습니다.

+1

'writeReplace (..) '를 사용하면 기본 직렬화 동작이 무시되므로 사용이 중단됩니다. 인터페이스를 제거하는 것과 동일합니다. – Bozho

0

난 당신이 아마도 당신이 ORM의 일종을 사용하는

을 (심각한 프로그램을 초래하지 것이다) 모두에서 외부 라이브러리를 사용하지 않는 것을 제외하고이 정적으로 확인 될 수 없음을 매우 확신 어떤 경우에는 직렬화 가능한 객체가 필요하거나 객체가 웹 서비스 나 Coreba와 같은 다른 미들웨어 스택을 통해 전송되어야하는 Hibernate와 같이 직렬화가 암시 적으로 수행되는 경우 (객체가 이와 같이 표시되는 경우).

수업의 목적은 무엇입니까?