2010-02-26 5 views
-1

Java에서 클래스를 수퍼 클래스로 직렬화 한 다음이를 바이트 배열로 변환하여 네트워크를 통해 전송하는 방법을 찾고 있습니다.Java에서 객체의 수퍼 클래스 직렬화

class SuperClass { 
    public int number1; 
} 

class SubClass extends SuperClass { 
    public int number2; 
} 

내가 단순히 그것을 슈퍼 클래스에 서브 클래스의 객체를 캐스팅 한 후 직렬화 가능하다고 생각하지 않습니다, 또는 내가 잘못 : 여기

은 예입니다? SubClass에서 상속 된 모든 값을 수동으로 새로운 SuperClass에 복사하지 않고이 "변환"을 수행 할 수있는 방법이 있습니까?

EDIT : 글쎄, 내가 원래 생각했던 방식대로 다리에 총을 쏘고 있다는 것을 알았 기 때문에, 내가하기로 결정한 것은 단순히 SubClass를 직렬화하여 네트워크 연결의 양쪽에서 사용하는 것입니다. 그것은 가장 간단한 일이며, 나는 캐스팅과 상속에 대해 걱정할 필요가 없습니다.

+0

나는 완전히 이해하지 못한다. 네트워크의 다른 쪽에서 "rehydrate"하고 싶은 것은 무엇입니까? SuperClass 인스턴스? – helios

+0

'writeReplace' (그리고'Serializable' 구현)을 찾고 계십니까? "상속에 비해 컴포지션을 선호"하는 것이 거의 확실합니다. –

답변

0

나는 단순히 슈퍼 클래스에 서브 클래스의 객체를 캐스팅 한 후

당신이 그것을 시도 아직 직렬화 가능하다고 생각하지 않습니다 ... 뭔가 할 수 있는지 확인하는 가장 쉬운 방법은 그게 전부 ...

당신은, 직렬화 된 객체에 대한 바이트 배열을 얻을있는 ByteArrayOutputStream에 직렬화를 할 경우

.

0

나는 당신의 제목이 당신이 정말로 원하는 것이 아니라고 생각합니다.

Java [...]로 클래스를 직렬화하고 네트워크를 통해 전송하는 방법을 찾고 있습니다.

위의 문제는보다 현실적인 소리.

public class SuperClass implements Serializable { 
    ... 
} 

public class Messenger { 
    ... 

    public void send (SuperClass obj) { 
     ObjectOutputStream oos = new ObjectOutputStream (socket.getOutputStream()); 
     oos.writeObject (obj); 
     oos.close(); 
    } 

    public SuperClass receive() { 
     //some work with ServerSocket#accept() should be here 
    } 
} 

당신은 슈퍼 클래스 또는 그 서브 클래스의 인스턴스입니다 위의 코드를 객체로 전송할 수 있습니다

당신이 뭔가를해야합니다. 그러나 하나의 하위 유형에서 객체의 일부만 전송하고 나머지 부분을 "반대편에"설정해야하는 경우 readObject()writeObject() 메소드를 해당 수퍼 클래스에 추가해야합니다. 자세한 내용은 직렬화에 대한 자습서를 참조하십시오 (link).

UPD :

만약 이미 다음 예외를 얻을 수 있습니다받은 객체의 클래스를로드하지 않는 객체를 직렬화 수신 반대편에 프로그램.

  1. 전송 객체의 클래스와 그 name 반대편에 : 당신이 알 수없는 sublass의 객체를 전송하기 위해 다음 단계를 수행해야 할 이유

    .

  2. 로드 타측 (즉 Class.forName (classname))에 클래스를 옮겼다.

  3. 이제 개체를 보내십시오.

가장 어려운 부분은 1 단계입니다. 그렇게하는 법을 생각해보십시오. 지금 당장 필요한 예제가 없지만 그 때까지 스스로 솔루션을 찾지 못한다면 아마 후자를 게시 할 것입니다.

+0

음, 그래,하지만 다른 쪽 끝의 클라이언트는 SubClass라는 클래스를 모르고 오직 SuperClass 만 알고있다. SubClass에서 SuperClass로 캐스팅을 시도했지만 작동하지만 객체는 여전히 SubClass입니다. SubClass의 객체를 SuperClass로 변환하고 직렬화하려고합니다. – Bevin

+0

아, 이제 분명합니다. 이 의견을 귀하의 질문에 추가하십시오. 다른 접근법이 필요합니다. 나는 나의 대답을 갱신하려고 노력할 것이다. 그러나 나는 많은 시간을 지금 가지지 않고있다. – Roman

1

OO 개념 : 이고 항상 "SuperClass"입니다. 따라서 캐스팅/복사/변환 할 필요가 없습니다. 그냥 SuperClass로 사용하십시오.

관련 문제