자바:개체를 텍스트 파일에 저장하시겠습니까?기성 솔루션이 있나요?

StackOverflow https://stackoverflow.com/questions/170554

  •  05-07-2019
  •  | 
  •  

문제

프로그램에서 생성한 개체를 저장하고 싶습니다.다시 시작한 후 앱은 배열의 모든 개체를 자동으로 로드해야 합니다.파일에 쓰고 다시 시작한 후 구문 분석하고 싶습니다.손으로 하는 것보다 더 똑똑한 가능성이 있을까요?감사합니다

도움이 되었습니까?

해결책

당신은 사용할 수 있습니다 버클리 DB PersistentMap 클래스를 저장하여 (Serializable)의 개체 Map 이를 파일에 유지하는 구현(캐시)입니다.사용이 매우 간단하며 무엇을 어디에 저장할지 걱정할 필요가 없습니다.

직렬화에 관해 주의할 세 가지 사항은 다음과 같습니다.

  1. 스키마 변경(예:클래스가 구성되는 데이터 변경 - 예를 들어 새 필드 추가)
  2. 파일이 손상되면 어떻게 되나요?프로그램의 저장소가 얼마나 안정적이어야 하는지에 따라 객체에 암시적으로 포함된 데이터를 저장하는 방법에 대한 결정이 영향을 받습니다.다음과 같은 관계형 데이터베이스를 항상 사용할 수 있다는 점을 기억하세요. MySQL 그런 다음 이 데이터를 개체로 변환합니다.
  3. 데이터를 보거나 쿼리할 수 있어야 합니까? 밖의 당신의 프로그램?"얼마나 많은 객체가 속성 x를 가지고 있습니까?"와 같은 간단한 질문에 대답하려면 어떻게해야합니까? (관계형) 데이터베이스를 사용한 경우 쉽게 수행 할 수 있습니다.파일에 내용을 직렬화했다면 그렇게 쉽지 않습니다!

다른 팁

예, 당신이 찾고있는 개념을 직렬화라고합니다. Sun에는 훌륭한 튜토리얼이 있습니다 여기.

아이디어는 지속하려는 클래스가 직렬화 가능한 인터페이스를 구현해야한다는 것입니다. 그런 다음 java.io.objectoutputstream.writeobject ()를 사용하여 파일에 개체를 작성하고 java.io.objectinputstream.readobject ()를 다시 읽습니다.

직렬화하는 것이 합리적이지 않은 것들이 있기 때문에 모든 것을 직렬화 할 수는 없지만 주변에서 일할 수 있습니다. 그것에 대한 인용문은 다음과 같습니다.

Java 직렬화의 기본 메커니즘은 사용하기가 간단하지만 알아야 할 사항이 더 있습니다. 앞에서 언급했듯이 직렬화 가능한 객체 만 지속될 수 있습니다. java.lang.object 클래스는 해당 인터페이스를 구현하지 않습니다. 따라서 Java의 모든 객체가 자동으로 지속될 수있는 것은 아닙니다. 좋은 소식은 AWT 및 Swing GUI 구성 요소, 문자열 및 어레이와 같은 대부분이 직렬화 가능하다는 것입니다.

반면, 스레드, 출력 스트림 및 하위 클래스 및 소켓과 같은 특정 시스템 레벨 클래스는 직렬화 할 수 없습니다. 실제로, 그들이 그랬다면 아무 의미가 없습니다. 예를 들어, JVM에서 실행되는 스레드는 내 시스템의 메모리를 사용하는 것입니다. 그것을 지속하고 JVM에서 실행하려고하는 것은 전혀 의미가 없습니다. Java.lang.object에 대한 또 다른 중요한 요점 직렬화 가능한 인터페이스를 구현하지 않으면 객체 만 확장하는 클래스 (및 기타 직렬화 가능한 클래스가 없음)가 인터페이스를 직접 구현하지 않는 한 직렬화 할 수 없다는 것입니다 (이전 예제와 같이).

그 상황은 문제를 제시합니다. 스레드 인스턴스가 포함 된 수업이 있으면 어떻게해야합니까? 이 경우, 우리는 그 유형의 객체를 지속 할 수 있습니까? 대답은 우리가 클래스의 스레드 객체를 과도로 표시함으로써 직렬화 메커니즘에 우리의 의도를 말하는 한 그렇습니다.

직렬화와 관련하여 일부 gotchas에 대한 효과적인 Java를 확인할 수 있습니다. 이것들은 일반적으로 고급이지만이 기능이 앱의 핵심 부분 인 경우 미리 알고 싶을 것입니다.

예로는 보안 문제, 상속 및 가장 중요한 것은 API를 실현하여 공개적으로 '동결'할 수있는 잠재력 (예 : 소프트웨어 버전)이 포함됩니다. 다시 말하지만, 이것들은 모두 진보되었으며 그 자체로 당신을 방해해서는 안됩니다.

java.io.object [input/output] 스트림은보아야 할 두 가지 클래스입니다.
파일을 유지하려는 모든 클래스는 java.io.serializable 인터페이스를 구현해야합니다.

XML 인코딩 사용을 고려할 수도 있습니다. 이는 직렬화보다 내구성이 더 많은 것으로 보입니다. 사용 java.beans.XMLEncoder/XMLDecoder 클래스.

나는 그것을 사용하지 않았지만 Google 코드가 출시되었습니다 protobuf 최근에.

나는 Mjlee와 동의합니다 Google의 프로토콜 버퍼 원래 직렬화 방법보다 객체를 저장하는 더 좋은 방법입니다. 살펴 보면 당신은 그것을 좋아할 것입니다.

왜 아무도 언급하지 않았는지 궁금합니다 JSON 예를 들어, Jackson Json Serializer.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top