2012-10-13 6 views
0

ObjectOutputStream과 함께 클라이언트와 서버 간의 소켓 기반 연결을 사용합니다. 직렬화 교환클라이언트와 서버 간의 이상한 "캐시"효과

객체는 이러한 구성을 가지고

public class RichiestaSalvataggioArticolo implements Serializable { 

     private ArticoloDati articolo; 

     public RichiestaSalvataggioArticolo(ArticoloDati articolo) { 
       this.articolo = articolo; 

     } 

     @Override 
     public void ricevi(GestoreRichieste gestore) throws Exception { 
       gestore.interpreta(this);      
     } 


     public ArticoloDati getArticolo() { 
       return articolo; 
     } 

} 

문제는 그 I는 2/10 필드에서만 차이가 매우 유사 incapsulated 콘텐츠 (ArticoloDati와 C/S 사이에서 메시지를 교환 할 때), 클라이언트는 ArticoloDati를 전송하지만 서버는 이전의 것을 수신합니다.

ObjectOutputStream은 호출 사이에 일종의 캐시 또는 메모리를 구현합니까? 매우 유사하기 때문에 제 2 객체가 다르다는 것을 인식하지 못합니까?

+0

스트림으로 출력 할 때마다 플러시를 시도 했습니까? – OmniOwl

+0

@Vipar 예, 했었습니다. – alessiop86

답변

0

직렬화에서 "역 참조"를 비활성화해야하므로 ObjectOutputStream.writeUnshared을 사용해야합니다.

ObjectOutputStream에 "공유되지 않은"개체를 씁니다. 이 메서드는과 동일하지만, 이전에 serialize 된 인스턴스를 가리키는 역 참조와 달리 지정된 개체를 항상 스트림의 새로운 고유 개체로 씁니다.

일부 경우에는 ObjectInputStream.readUnshared (이 포함)을 사용하는 것이 좋습니다.

+0

몇 가지 테스트를 해봐야하지만 대답을 받아 들여야합니다. 그것은 내가 알 필요가있는 것입니다. – alessiop86

+0

@mark 귀하의'RichiestaSlavataggioArticolo' 객체는 동일한 신원을 가지며 상태 만 변경되었습니다. 이전에 직렬화 된 복사본 (만료 된 상태 포함)은 서버 측에 저장되며 클라이언트는 이전에 직렬화 된 객체에 대한 참조 만 기록합니다. 이 동작은 의도적이며 비공유 방법을 사용하여 피할 수 있습니다. – oldrinb

관련 문제