2012-12-20 7 views
1

Java SE 7을 사용하여 ServerSocket/Socket을 통해 간단한 채팅 프로그램을 만들고 있습니다. 보낸 모델/엔티티 내부의 데이터가 클라이언트에서 서버로 또는 바이스 사이에서 일치하지 않는 것이 가능한지 궁금합니다. 결과적으로 다른 데이터를 포함하는 동일한 클래스 유형을 보낼 때 내 클라이언트의 보낸 모델에서 서버로 데이터가 일치하지 않게됩니다.Java 직렬화 데이터 불일치

Example 
Client: Sending... ID: 3 
Server: Received... ID: 3 
Client: Sending... ID: 4 
Server: Recieved... ID: 3 

다음 내 모델/단체의 내 일반적인 패러다임 :

abstract class Record<T> extends Observable implements Serializable { 
    // with generated "serialVersionUID" by the EclipseIDE[Juno] 
    protected int id; 
    // Constructor, Getters/Setters, Abstract methods 
    // hashCode(): Generated by Eclipse 
    // equals(): Generated by Eclipse, replacing Record with Record<T> 
} 
abstract class RecordVersion<T> extends Record<T> implements Serializable { 
    // with generated "serialVersionUID" by the EclipseIDE[Juno] 
    protected int version; 
    // Constructor, Getters/Setters, Abstract methods 
    // hashCode(): Generated by Eclipse 
    // equals(): Generated by Eclipse, replacing RecordVersion with RecordVersion<T> 
} 
class SampleRecord extends RecordVersion<SampleRecord> { 
    // with generated "serialVersionUID" by the EclipseIDE[Juno] 
    private String data; 
    // Constructor, Getters/Setters, Abstracted methods 
    // hashCode(): Generated by Eclipse 
    // equals(): Generated by Eclipse 
} 

가 뭘까요 방법이 문제를 해결하려면? 감사.

UPDATE 1 :

읽는 socket.getInputStream() 같은 ObjectOutputStream에 걸쳐 여러 번 같은 개체 인스턴스를 보낼 시도하는 경우, 당신은 문제에 실행하려고

class ReadRunnable implements Runnable { 
    private Object lastObjectReceived = new Object(); 
    @Override 
    public void run() { 
    while(true) { 
     try { 
     // inStream: java.io.ObjectInputStream 
     Object objectReceived = inStream.readObject();  
     if(objectReceived .equals(lastObjectReceived)) 
      objectReceived = inStream.readObject(); 
     else 
      lastObjectReceived = objectReceived; 
     } catch(Exception e) { 
     ex.printStackTrace(); 
     } 
    } 
    } 
} 
+0

정확히 디버거가 좋은 점입니다. 당신은 당신이 보낸다고 생각하는 것을 보내지 않을 것이거나 당신이받는 것으로 생각하는 것을받지 못하기 때문에 불일치가 생깁니다. – Isaac

+0

나는 볼 수있다. 그러나 나는'lastObjectReceived'를 다루고 그것을 실제의'objectReceived'와 비교하려고하고 그것들이 같은지 비교한다. 불행히도, 여전히 같은 문제. –

+0

음 ... 몇 가지 코드를 게시하십시오. – Isaac

답변

2

java.io.ObjectInputStream을 통해 개체 스트림 때문에 객체 신원을 보존합니다. 새 데이터로 동일한 객체 인스턴스를 다시 보내려면 ObjectOutputStream.reset() 사이에 호출해야합니다.

또한 루프에서 전송 된 개체 중 하나가 "손실"됩니다. if 블록의 첫 번째 브랜치는 .readObject()을 호출하고 while 루프의 시작은 .readObject()을 다시 호출하여 비교하기 전에 이전 호출의 결과를 무시합니다.

+0

어디에서'ObjectOutputStream.reset()'을 놓을까요? 'write()'또는'flush()'의 앞/뒤에? –

+1

@ Dr.Java - 'flush()'전에. '.writeObject()'의 전후는 실제로 매번 호출 될 때까지 중요하지 않습니다. – jtahlborn

+0

고마워요. 그러나 나는'.flush()'다음에 최상이라고 생각합니다. 어느쪽으로 든 그것의 주위에 작동했다. –