2017-02-21 3 views
0

현재 웹 응용 프로그램을 개발 중이며 언제든지 검색 할 수 있도록 서버에 영구적으로 Java 객체를 만들고 싶습니다. 데이터베이스는 애플리케이션에 과도한 부담이되므로 java 객체를 영속화하는 가장 쉬운 방법 인 XML 또는 바이트로의 직렬화를 선택합니다. 불행히도 내가 사용하는 코드의 큰 부분은 수정할 수없는 자바 클래스이고,이 클래스는 '직렬화 가능'인터페이스를 구현하지 않는다. 이 클래스의 객체뿐만 아니라 다른 클래스의 객체를 직렬화하는 것과 관련하여 내 옵션은 무엇입니까?직렬화가 불가능한 타사 클래스의 Java 직렬화

+1

하위 클래스에서 하위 클래스를 만들고 하위 클래스에서 Serializable을 구현할 수 있다면 지금 가고 있습니다. 다른 방법은 직접 직렬화하는 사용자 지정 방법을 구현하는 것입니다. 귀하의 질문에 대답하기에는 너무 광범위합니다. 그러나 간단한 예제로 Path가 동일한 기계에 의해 항상 직렬화 될 경우 String을 직렬화 할 수 있습니다. java.io.Stream과 같은 클래스는 단순히 직렬화 할 수 없다는 것을 이해하십시오. 스트림에서 다른 것으로부터 코드를 재 작성하는 방법을 찾아야합니다. –

+0

필자는 필자의 경우 솔루션이 writeObject 및 readObject 메서드를 자체 구현하여 Serializable 인터페이스를 사용하여 개체를 직렬화하는 사용자 지정 방법을 구현하는 것이라고 생각합니다. 원래 제 3 자 클래스를 래핑하는 것이 어떻습니까? 이 클래스를 확장하거나 써드 파티 클래스의 객체에 대한 참조를 갖는 새로운 클래스를 생성함으로써? –

+0

직렬화가 필요한 모든 클래스에 고유 한 Serializable 클래스가있는'Serializable toSerializable (T objectToSerialize)'와'T fromSerializable (Serializable serializedObject) '의 두 가지 메서드를 제공하는'Serializer '인터페이스에 대해 설명하겠다.그런 다음 모든 Serializer를 직렬화 서비스/팩토리에 랩핑하여 찾을 수 있습니다. 따라서 직렬화 할 수없는 클래스와 직렬화 된 파일 사이에는 중간 (DAO) 계층 만있을 것입니다. –

답변

1

내 의견에 말했듯이, SerializationService은 저장하려는 모든 개체에 대해 적절한 Serializer<T>을 찾을 수 있습니다.

뭔가 같은 :

public interface Serializer<T> { 

Serializable toSerializable(T objectToSerialize); 

//to build a factory/service around it 
boolean canDeserialize(Serializable serializedObject); 

T fromSerializable(Serializable serializedObject); 

}

그리고 당신은 기본, 구체적인 예를 원하는 경우 :

public class PathSerializer implements Serializer<Path> { 

@Override 
public Serializable toSerializable(Path objectToSerialize) { 
    return objectToSerialize.toString(); 
} 

@Override 
public Path fromSerializable(Serializable serializedObject) { 
    if(!canDeserialize(serializedObject)){ 
     throw new IllegalArgumentException("Cannot deserialize this"); 
    } 
    return Paths.get((String)serializedObject); 
} 

@Override 
public boolean canDeserialize(Serializable serializedObject) { 
    return serializedObject != null && serializedObject instanceof String; 
} 

}

당신은 할 수 : 꽤 공통 패스와 함께 또한 원래 객체 클래스의 이름과 parame의리스트를 포함하는 POJO를 매우 잘 저장한다. 리플렉션으로 개체를 재생성 할 수 있도록 생성자 또는 필드의지도가 필요합니다.

응용 프로그램의 복잡성과 모든 것은 사용자에게 달려 있습니다.

0

JSON이 여기있는 해결책이라고 생각합니다. 예를 들어 Googles GSON 라이브러리를 가져 가십시오. 당신은 단순히 official JSON documentation를 참조 JSON 형식에 대한 일반적인 정보는

Gson gson = new Gson(); 
MyObj obj = gson.fromJson(jsonString); 
String json = gson.toJson(obj); 

쓰기, 수업에 주석을 달 필요가 없습니다.

0

내부 상태를 저장하고 해당 클래스에 Serializable을 구현하기 위해 액세스 권한이없는 클래스를 확장하는 것이 하나의 옵션입니다. 이 SO 질문에

추가 정보 :이 외에도 Serializing a class variable which does not implement serializable

, 나는 어떤 래퍼를 구축하고 XML 또는 JSON에 수동으로 클래스를 직렬화 제외한 다른 옵션이 있다고 생각하지 않습니다.

+0

이 수동 직렬화는 래퍼 클래스의 코드 예제에서 제공 할 수 있습니까? 감사! –

관련 문제