2010-02-09 9 views
14

클래스가 Serializable을 구현하고 있습니다. 이제이 클래스를 확장하고이 확장 클래스를 직렬화 할 수 없게하려고합니다. 그렇게하는 방법?자바에서 비 순차 클래스로 자식 클래스 만들기

예를 들면. 나는

class A implements Serializable. 

을하고 난
class B extends A. 

을하지만 클래스 B는 비 직렬화되고 싶어요.

+2

이 질문은 실제로 지속성에 관한 것입니까? –

+0

이것은 특히 모든 직렬화 가능 Swing 클래스 IMHO의 문제점입니다. 'AbstractTableModel' (직렬화 가능)의 하위 클래스를'JTable'에 전달할 때, 저는 보통'JTable'이 모델을 직렬화 할 것을 기대하지 않습니다. 여전히 서브 클래스를 직렬화 할 수있는 요구 사항을 피할 수는 없습니다. –

답변

13

, 그것은 Serializable 비이 될 수있는 Serializable 클래스의 서브 클래스 불가능하도록하는 것입니다.

서브 클래스의 속성을 직렬화하지 않기를 원하는 경우, 한 가지 옵션은 모든 것을 일시적으로 만드는 것입니다. 당신이 (당신이 직렬화로 슈퍼 클래스 필드를 원하지 않는) 그 이상이 필요한 경우

, writeObject(ObjectOutputStream) 무시하고 readObject(ObjectInputStream) 여기에 설명 된대로 - 당신은 인터페이스를 제거 할 수 없습니다 https://web.archive.org/web/20120626144013/http://java.sun.com/developer/technicalArticles/ALT/serialization

+1

Sun.com의 링크는 더 이상 유효하지 않습니다. 이것도 같은 기사입니까? http://www.oracle.com/technetwork/articles/java/javaserial-1536170.html – spaaarky21

+1

@ spaaarky21 아니요, 같은 기사가 아닙니다. 지금 archive.org 링크를 업데이트했습니다. – Nayuki

4

실제로 가능하지 않습니다. 가장 좋은 건 A를 장식/B 복합 다른 사람이 분명히함에 따라

public class B { 
    private A a = new A(); 

    public void doSomething() { 
     a.doSomething(); 
    } 
} 
+0

'B '가 모두'Serializable'인'Throwable','Component','Action'의 서브 클래스 일 필요가있는 경우에는 처리 할 수 ​​없습니다. –

14

,하지만 당신은 직렬화를 방지 할 수 있습니다 실행시 : 당신이 이제까지 모든 구성원 transient을하여 직렬화됩니다 클래스에서 아무 것도 보장하지 수 있지만

class B extends A { 
    private void writeObject(ObjectOutputStream oos) throws IOException { 
     throw new NotSerializableException(); 
    } 
} 
+3

이것은 누군가가 당신이 Serializable을 구현했는지를 검사 한 후에 실제로 직렬화 할 것으로 예상 할 때 많은 문제를 일으킬 수 있습니다. –

+4

이것은 Sun에서 권장합니다.http://java.sun.com/developer/technicalArticles/ALT/serialization/ ("Other Pointers"단락을 참조하십시오.) – finnw

3

항상, 직렬화 가능합니다.

1

의견 중 하나를 응답 (당신은 JPA 또는 최대 절전 모드의 이야기 가정) :

을하지만, 그 객체를 원하는 모든 클래스는이를 구현해야 지속되어야한다. 클래스 B의 객체를 지속성이없는 객체로 만들고 싶습니다.

B를 영구 보존하지 않으려면 @Entity으로 표시하지 마십시오. 그러나 B가 영구적 인 개체 IMHO가 아닌 경우 B가 A를 확장하는 것은 실제로 의미가 없습니다. 이것은 상속의 나쁜 사용이 될 것입니다.

0

readObject() 및 writeObject() 메소드를 구현해야합니다.

+0

답변을 추가하기 전에 제안 된 이전 솔루션을 읽어야합니다.이 경우 귀하의 제안은 이미 제안 된 것이며 @Jack Leow의 [accepted] (https://stackoverflow.com/a/2229256/1387113). – hd84335

관련 문제