문제

내가 사용하 Java1.4Log4J.

어떤 나의 코드를 포함한 직렬화를 나열 값을 객체(Pojo).

의 각 내 Pojo 선언 로거

private final Logger log = Logger.getLogger(getClass());

Serializer 의 불평 org.apache.log4j.로거되지 않는 직렬화.

사용해야 합니까

private final transient Logger log = Logger.getLogger(getClass());

까요?

도움이 되었습니까?

해결책

어떻게 사용에 대한 정적 logger?해야 하는 다른 로거 참조를 위해 각 클래스의 인스턴스가?정적 필드를 직렬화하지 않는 기본적으로;할 수 있는 명시적으로 선언의 필드를 직렬화하는 개인,정전,최종 배열의 ObjectStreamField 이름 serialPersistentFields. Oracle 설명서를 참조

추가 콘텐츠:당신이 사용 getLogger(getClass()), 을 사용하여 동일한 로거에서 각각의 인스턴스입니다.를 사용하려면 별도의 로거를 위한 각각의 인스턴스를 구별해야 하는 이름의 로거에 getLogger()-method.예:getLogger(getClass().getName()+의 차()).다음 사용 일시적인 특성을 확인하는 로거가 없는 직렬화됩니다.

다른 팁

로 정지 상태로 표시되어야 합니다;이 make it non-직렬화.

아무 이유도 없을 로거는 정적이 아닌가 있는 경우를 제외하고 강력한 이유 그래서 그것을 할 수있는.

는 경우 가고 싶은 일시적인 접근 방식을 다시 설정해야에 로그인할 때 개 deserialize.을 할 수있는 방법이 구현하는 방법:

 private void readObject(java.io.ObjectInputStream in) 
   throws IOException, ClassNotFoundException;

서 javadocs for Serializable 에 대한 정보를 이 방법입니다.

당신의 그것의 구현은 다음과 같습니다.

 private void readObject(java.io.ObjectInputStream in) 
     throws IOException, ClassNotFoundException {
   log = Logger.getLogger(...);
   in.defaultReadObject();
 }

하지 않으면 이렇게 로그인이 될 것입 null 후 deserialize 귀하의 개체입니다.

중 하나를 선언 logger 필드는 정적 또는 일시적이다.

모두 방법을 확인 writeObject()메소드를 시도하지 않습니다 쓸 필드를 출력 스트림을 중 serialization.

일반적으로 logger 필드는 정적으로 선언하지만,당신이 그것을 필요로 하는 경우를 인스턴스가 될 필드 그냥 선포 그것을 일시적으로 일반적으로 수행에 대한 모든 비 serializable 필드입니다.에 따라 진행하고 로드 null 이 될 수 있지만,그래서 당신을 구현하 readObject()메소드를 초기화됩니다.

을 시도를 만드는 로 정체되는 대신.보다 당신은 없을 걱정하는 직렬화로 처리하고 있기 때문에 클래스 로더가 필요합니다.

이러한 종류의 케이스에서,특히 EJB,일반적으로 최고의 처리를 통해 실니다.일반적으로 사용하는 경우가 뭔가를 당신과 같이 특정 거래는 문제가 발생하고 필요하신 상승 logging 디버깅하는 작업을 생성할 수 있습니다 상세한 로깅을에 문제 작업입니다.일부를 수행 스레드를 지역 상태에서 트랜잭션을 사용하는 것을 선택하는 올바른 로거.솔직히 제가 어디 있는지 몰라 그것이 도움이 될 것이라고 수준을 설정하려면에서 인스턴스 때문에 이 환경을 매핑으로 인스턴스 거래 컨테이너 수준의 함수,당신은 하지 않습니다 실제로 제어의 인스턴스가에 사용되는 트랜잭션이 어쨌든.

하는 경우에도 당신과 함께 다루고 있어 DTO 그것은 일반적으로 좋은 아이디어를 디자인하는 시스템에서 같은 방법으로 지정된 특정한 인스턴스가 필요하기 때문에 디자인에게 진화하는 방법에는 장점이 있습니다.오를 수 있와 함께 한 달에서 이제는 것을 결정 효율성을 고려 사항(캐싱 또는 기타 생명 주기 변경 최적화)하는 것에 대한 가정의 매핑을 경우 단위로 작동합니다.

당신이 원하는 로 할당 인스턴스는 다음을 그렇다,당신은 것을 만들고 싶어 그것을 일시적인 경우를 직렬화하의 개체입니다.Log4J 로거 없는 직렬화하지 않 버전에서 Log4J 에 사용하는 어쨌든,그래서 당신은하지 않 Logger 필드를 일시적인 당신을 얻을 것이 예외에 serialization.

로거는 직렬화되지 않도록 사용해야 합니다 과도를 저장할 때에 그들을 인스턴스가 필드가 있습니다.을 복원하려는 경우에는 로거한 후 진행하고 저장할 수 있는 수준(String)가 쌓이면 결국 지하 객체를 얻을 수 없는 직렬화됩니다.

좋은 이유가있다 인스턴스를 사용하여 로거.하나는 매우 좋은 사례입니다 그래서 당신이 선언할 수 있습 로거에는 수퍼 클래스고에서 사용하는 모든 서브 클래스(다만 아쉬운 점이 있다 로그에서는 수퍼 클래스에 기인 서브 클래스이지만 그것은 일반적으로 쉽게 참조).

(다음과 같 다른 사용하여 정적 또는 일시).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top