2011-01-04 8 views
1

일부 데이터를 추적하는 서버가 있습니다. 관리자 응용 프로그램으로 서버에 연결하여 데이터의 현재 상태를 확인합니다. 새로 고침 빈도는 5 초입니다. 서버가 처음으로 데이터를 전송하면 작동합니다. 그러나 두 번째로 데이터가 변경되면 관리자 측에서 최신 데이터를받지 못합니다. 나는 ObjectOutputStream에와 ObjectInputStream를 통해 클래스에 싸여 데이터를 보내고있다 : I 시도 무엇Java : 직렬화가 두 번째로 작동하지 않습니다.

public class Leerling implements Serializable { 

    public int llnID; 

    public String naam; 
    public String voornaam; 
    public String klas; 
    public int klasNummer; 
    public Date geboorteDatum; 

    public String getFullName() 
    { 
     return voornaam + " " + naam; 
    } 

    @Override 
    public String toString() { 
     return "Leerling{" + "llnID=" + llnID + ", naam=" + naam + ", voornaam=" + voornaam + ", klas=" + klas + ", klasNummer=" + klasNummer + ", geboorteDatum=" + geboorteDatum + '}'; 
    } 

} 


public class SLeerling extends Leerling implements Serializable{ 

    public boolean voted; 
    public int vote = -2; 
} 

가 스트림에서 개체를 읽기 전에이다

이것은 데이터의 래퍼 클래스입니다 System.gc();을 호출하여 객체의 이전 객체가 메모리에 더 이상 존재하지 않는지 확인하십시오. 그러나 성공하지 못했습니다.

누군가가 정확한 문제를 알고 있습니까? 실제 최신 데이터를 얻을 수있는 방법은 무엇입니까?

미리 감사드립니다.


문제의 제 2 예 : 일부 다른 데이터 래퍼 클래스 (그것이 내부 클래스)을 다시 한

는 :

public static class MonitorResponse implements Serializable 
{ 
    public int numberOfLLN; 
    public int blocked; 
    public int blancos; 
    public List<Integer> votes; 
} 

I는 먼저 데이터를 보낼 때 시간, 그것은 작동합니다. 하지만 두 번째로 (업데이트하기 위해) 보내면 List<Integer> votes을 제외한 모든 항목이 업데이트됩니다. 따라서 votes은 새로 고쳐지지 않습니다. 은 그 때 나는 그것을 배열하여 목록을 교체하여 까다로운 비트 해결 :

public static class MonitorResponse implements Serializable 
{ 
    public int numberOfLLN; 
    public int blocked; 
    public int blancos; 
    public Integer[] votes; 
} 

그리고 이것은 완벽하게 작동합니다. 당신이 나에게 묻는다면 이상합니다. 코드의 다른 부분은 거의 변경되지 않았습니다 ... (목록 대신 배열을 구현하는 것을 제외하고)

+0

지금까지 제공 한 정보에서를,이 소리가 나지 않습니다. 관리자 페이지에서 캐싱 및 새로 고침과 같은 문제가 생깁니다. 새로 고침을 통해 수신 한 데이터가 유효하지 않은 경우 단순히 5 초 새로 고침 만하면 도움이되지 않습니다. – rfeak

+0

반환 데이터의 끝에 타임 스탬프를 넣어 브라우저가 캐시하지 않도록하십시오. –

+0

@Michael : 브라우저를 사용하고 있지 않습니다. 내 자신의 자바 데스크톱 응용 프로그램 (아니라 애플릿뿐만 아니라) –

답변

5

아마 ObjectOutputStream이 문제의 원인 일 수 있습니다.

ObjectOutputStream 개체를 서버에서 사용하는 경우 reset을 호출해야합니다. 그렇지 않으면 이전에 작성된 개체에 대한 공유 참조가 기록됩니다. 이것은 당신이보고있는 것과 같습니다.

이 문제를 설명하기 위해 : 그것은 직렬화와 아무 상관이 같은

class BrokenServer { 
    void sendBrokenVoteData(ObjectOutputStream out) { 
     out.writeObject(votes); 
     changeVoteData(votes); 
     out.writeObject(votes); // Writes a shared reference to "votes" WITHOUT updating any data. 
    } 
} 

class FixedServer { 
    void sendFixedVoteData(ObjectOutputStream out) { 
     out.writeObject(votes); 
     changeVoteData(votes); 
     out.reset(); // Clears all shared references. 
     out.writeObject(votes); // Writes a new copy of "votes" with the new data. 
    } 
} 
+0

참고, 당신은 또한 OOS.writeUnshared() 메서드를 사용할 수 있습니다. – jtahlborn

+0

감사! 정말 고마워! –

+0

@jtahlborn'writeUnshared'는 대부분 쓸모가 없습니다. 공유되지 않은 개체는 얕은 것이므로 개체가 여전히 가리키는 다른 개체가 공유됩니다. –

관련 문제