현재 웹 응용 프로그램을 개발 중이며 언제든지 검색 할 수 있도록 서버에 영구적으로 Java 객체를 만들고 싶습니다. 데이터베이스는 애플리케이션에 과도한 부담이되므로 java 객체를 영속화하는 가장 쉬운 방법 인 XML 또는 바이트로의 직렬화를 선택합니다. 불행히도 내가 사용하는 코드의 큰 부분은 수정할 수없는 자바 클래스이고,이 클래스는 '직렬화 가능'인터페이스를 구현하지 않는다. 이 클래스의 객체뿐만 아니라 다른 클래스의 객체를 직렬화하는 것과 관련하여 내 옵션은 무엇입니까?직렬화가 불가능한 타사 클래스의 Java 직렬화
답변
내 의견에 말했듯이, 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를 매우 잘 저장한다. 리플렉션으로 개체를 재생성 할 수 있도록 생성자 또는 필드의지도가 필요합니다.
응용 프로그램의 복잡성과 모든 것은 사용자에게 달려 있습니다.
JSON이 여기있는 해결책이라고 생각합니다. 예를 들어 Googles GSON 라이브러리를 가져 가십시오. 당신은 단순히 official JSON documentation를 참조 JSON 형식에 대한 일반적인 정보는
Gson gson = new Gson();
MyObj obj = gson.fromJson(jsonString);
String json = gson.toJson(obj);
쓰기, 수업에 주석을 달 필요가 없습니다.
내부 상태를 저장하고 해당 클래스에 Serializable을 구현하기 위해 액세스 권한이없는 클래스를 확장하는 것이 하나의 옵션입니다. 이 SO 질문에
추가 정보 :이 외에도 Serializing a class variable which does not implement serializable
, 나는 어떤 래퍼를 구축하고 XML 또는 JSON에 수동으로 클래스를 직렬화 제외한 다른 옵션이 있다고 생각하지 않습니다.
이 수동 직렬화는 래퍼 클래스의 코드 예제에서 제공 할 수 있습니까? 감사! –
하위 클래스에서 하위 클래스를 만들고 하위 클래스에서 Serializable을 구현할 수 있다면 지금 가고 있습니다. 다른 방법은 직접 직렬화하는 사용자 지정 방법을 구현하는 것입니다. 귀하의 질문에 대답하기에는 너무 광범위합니다. 그러나 간단한 예제로 Path가 동일한 기계에 의해 항상 직렬화 될 경우 String을 직렬화 할 수 있습니다. java.io.Stream과 같은 클래스는 단순히 직렬화 할 수 없다는 것을 이해하십시오. 스트림에서 다른 것으로부터 코드를 재 작성하는 방법을 찾아야합니다. –
필자는 필자의 경우 솔루션이 writeObject 및 readObject 메서드를 자체 구현하여 Serializable 인터페이스를 사용하여 개체를 직렬화하는 사용자 지정 방법을 구현하는 것이라고 생각합니다. 원래 제 3 자 클래스를 래핑하는 것이 어떻습니까? 이 클래스를 확장하거나 써드 파티 클래스의 객체에 대한 참조를 갖는 새로운 클래스를 생성함으로써? –
직렬화가 필요한 모든 클래스에 고유 한 Serializable 클래스가있는'Serializable toSerializable (T objectToSerialize)'와'T fromSerializable (Serializable serializedObject) '의 두 가지 메서드를 제공하는'Serializer'인터페이스에 대해 설명하겠다.그런 다음 모든 Serializer를 직렬화 서비스/팩토리에 랩핑하여 찾을 수 있습니다. 따라서 직렬화 할 수없는 클래스와 직렬화 된 파일 사이에는 중간 (DAO) 계층 만있을 것입니다. –