2010-01-22 3 views
6

serialize하려는 클래스가 있고 Serializable을 구현하지만 포함 된 개체 중 하나가 Serializable을 구현하지 않습니다.java에서 런타임에 클래스가없는 클래스에 Serializable 인터페이스를 추가 할 수 있습니까?

클래스를 직렬화 할 수 있도록 직렬화 가능 인터페이스를 구현하도록 런타임에 클래스를 수정하는 방법이 있습니까? 제 3 자 라이브러리이므로 컴파일 할 때 변경할 수 없습니다.

아마도 바이트 코드 라이터 같은 것을 사용해야할까요?

EDIT : 포함 된 클래스와 포함 된 클래스 모두 제 3 자 라이브러리에 있으므로 어떤 것을 일시적으로 표시 할 수 있다고 생각하지 않습니다. 포함 된 클래스 이며 직렬화 가능으로 표시되어 있지만 포함되지 않은 개체가 포함되어 있습니다.

클래스에 대한 사용자 지정 serialization 메서드를 작성해도 문제가 없지만 개인 변수의 값을 가져 오기 위해 리플렉션을 사용해야합니까?

답변

5

, 나는 참조 :이 정확한 서명을 특별한 방법을 구현해야하는 직렬화 및 직렬화 과정에서 특수 처리 을 필요로

클래스 :

private void writeObject(java.io.ObjectOutputStream out) 
    throws IOException 
private void readObject(java.io.ObjectInputStream in) 
    throws IOException, ClassNotFoundException; 
private void readObjectNoData() 
    throws ObjectStreamException; 

비협조적인 필드를 수동으로 직렬화하는 데 사용할 수 있습니다. ASM을 사용할 수는 있지만 유지 관리가 가능한 솔루션이라고 생각하기는 어렵습니다.

+0

Externalizable 인터페이스를 사용하십시오. http://java.sun.com/j2se/1.3/docs/api/java/io/Externalizable.html –

+0

포함 된 클래스가 제 3 자 라이브러리에도 포함되어 있으므로 그 방법들을 그것에 추가하십시오. – Kyle

+0

그럼 ASM을 배울 시간이라고 생각합니다. – bmargulies

3

필드는 transient 수정자를 사용하여 건너 뛸 수 있습니다. readObjectwriteObject 메소드를 제공하여 추가 데이터를 스트림에 추가 할 수 있습니다. 클래스는 서브 클래스 화하여 직렬화 할 수 있지만 (수퍼 클래스 데이터를 관리해야 함) 직렬 프록시를 사용해야합니다 (유효 자바 참조). 직렬화를위한 Javadoc 읽기

0

클래스가 직렬화 가능으로 표시되지 않은 경우 (데이터베이스 연결을 예로 들겠습니다). 따라서 먼저 객체를 직렬화해야하는 경우 먼저 무엇보다 자신을 분명하게 만듭니다. 주변의 객체를 직렬화하면되므로 포함 된 객체를 일시적으로 표시 할 수 있습니다.

1

우선, 이 필요합니까? 어쩌면 타사 라이브러리의 클래스가 의도적으로 직렬화되지 않을 수 있습니다. 고의적 인 결정보다는 누락이라 할지라도 도우미 클래스에 사용자 지정 직렬화 메서드를 작성하는 것은 쉽습니다. 당신이 을 가지고 있다면 (마치 내가 비슷한 것처럼). Javassist을보세요. 당신이 뭔가를 할 수 있습니다

ClassPool pool = ClassPool.getDefault(); 
CtClass cc = pool.get("mypackage.MyClass"); 
cc.addInterface(pool.get("java.io.Serializable")) 

편집 : 대신 모든 더러운 일 자신의 일을 XStream 같은 타사 직렬화 API를 사용할 수 있습니다.

+0

도우미 클래스에 사용자 지정 serialization 메서드를 작성하는 방법 : 어떻게해야합니까? 개인 변수 값을 가져 오기 위해 리플렉션을 사용해야합니까? – Kyle

+0

LOL. 이 답변은 질문이 나온 후 32 분이 지나면 "serialization java third party"에 대한 세 번째 Google 결과입니다. –

0

java.lang.reflect.Proxy를 사용하여 라이프 사이클 컨트롤이없는 (즉, 서브 클래스화할 수없는) 객체 인스턴스에 Serializable 인터페이스를 추가하고 이러한 방식으로 직렬화 할 수 있습니다. 하지만 다른 해킹 (즉, 대리 클래스 도입) 없이는 다시 읽을 수 없습니다.

일반적으로 Java Serializable 메커니즘에 대한 대안을 찾아 보는 것이 좋습니다. 그것은 여러면에서 디자인에 의해 상당히 파괴되었습니다.

+0

많은 개발자들이 Java의 "broken by design"직렬화로 완벽하게 이상하다는 것이 이상합니다. 자체 표준화 롤링은 끔찍한 해결책입니다. 많은 표준 Java 라이브러리/프레임 워크가 Serializable을 사용합니다. 각자의 해결 방법을 프로그램해야합니까? – Nate

관련 문제