현재 웹 응용 프로그램을 개발 중이며 언제든지 검색 할 수 있도록 서버에 영구적으로 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에 수동으로 클래스를 직렬화 제외한 다른 옵션이 있다고 생각하지 않습니다.
이 수동 직렬화는 래퍼 클래스의 코드 예제에서 제공 할 수 있습니까? 감사! –
- 1. 직렬화가 불가능한 클래스와 클래스에서 kryo 직렬화 작업이 직렬화 할 수없는 속성을 가지고 있습니까?
- 2. (닫힘) Java 직렬화가 작동하지 않습니다.
- 3. Silverlight에서 직렬화/역 직렬화가 가능합니까?
- 4. 매우 빠른 직렬화가 필요합니다. Java
- 5. 변경된 클래스의 비 직렬화
- 6. C# : 타사 객체를 직렬화 가능하게 만들기
- 7. 읽기 전용 (변경 불가능한) 직렬화 가능 클래스
- 8. 변경 불가능한 클래스의 다형성 업데이트
- 9. C#을 사용한 직렬화, 루비와의 직렬화가 가능합니까?
- 10. iOS 직렬화/직렬화가 제대로 작동하지 않습니다.
- 11. 직렬화가 생성 한 XML에 오류를주는 데 직렬화
- 12. 직렬화 된 데이터의 직렬화가 실패합니다. 이유는 무엇입니까?
- 13. 직렬화/직렬화가 성능을 어떻게 향상시킬 수 있습니까?
- 14. 직렬화가 아닌 XML 파일을 사용한 직렬화 해제
- 15. 네트워크를 통한 Java 직렬화
- 16. Android 캘린더 직렬화가 Java 6과 호환되지 않습니다.
- 17. gson을 사용하여 수정 불가능한 컬렉션에 비 직렬화
- 18. JSON 직렬화 불가능한 django REST 프레임웍
- 19. 잭슨 직렬화가
- 20. 불가능한 Java 메모리 일관성 오류
- 21. XML에 대한 클래스의 직렬화가 공백 값을 남기고 있습니다.
- 22. 복제본을 제거하고 수정 불가능한 클래스의 순서를 유지하십시오.
- 23. C# 클래스의 직렬화 중지
- 24. IEnumerator를 구현하는 클래스의 직렬화
- 25. 부모 클래스의 GSON 직렬화
- 26. 전체 클래스의 이진 직렬화
- 27. Java에서 익명 클래스의 직렬화
- 28. 클래스의 잭슨 비 직렬화
- 29. 부분 클래스의 직렬화
- 30. 정적 내부 클래스의 직렬화
하위 클래스에서 하위 클래스를 만들고 하위 클래스에서 Serializable을 구현할 수 있다면 지금 가고 있습니다. 다른 방법은 직접 직렬화하는 사용자 지정 방법을 구현하는 것입니다. 귀하의 질문에 대답하기에는 너무 광범위합니다. 그러나 간단한 예제로 Path가 동일한 기계에 의해 항상 직렬화 될 경우 String을 직렬화 할 수 있습니다. java.io.Stream과 같은 클래스는 단순히 직렬화 할 수 없다는 것을 이해하십시오. 스트림에서 다른 것으로부터 코드를 재 작성하는 방법을 찾아야합니다. –
필자는 필자의 경우 솔루션이 writeObject 및 readObject 메서드를 자체 구현하여 Serializable 인터페이스를 사용하여 개체를 직렬화하는 사용자 지정 방법을 구현하는 것이라고 생각합니다. 원래 제 3 자 클래스를 래핑하는 것이 어떻습니까? 이 클래스를 확장하거나 써드 파티 클래스의 객체에 대한 참조를 갖는 새로운 클래스를 생성함으로써? –
직렬화가 필요한 모든 클래스에 고유 한 Serializable 클래스가있는'Serializable toSerializable (T objectToSerialize)'와'T fromSerializable (Serializable serializedObject) '의 두 가지 메서드를 제공하는'Serializer'인터페이스에 대해 설명하겠다.그런 다음 모든 Serializer를 직렬화 서비스/팩토리에 랩핑하여 찾을 수 있습니다. 따라서 직렬화 할 수없는 클래스와 직렬화 된 파일 사이에는 중간 (DAO) 계층 만있을 것입니다. –