[java] Java에서 직렬화의 목적은 무엇입니까?

나는 Serialization에 대한 많은 기사를 읽고 그것이 얼마나 훌륭하고 훌륭하지만 어떤 주장도 충분히 설득력이 없었습니다. 누군가가 클래스를 직렬화하여 실제로 달성 할 수있는 것이 무엇인지 말해 줄 수 있는지 궁금합니다.



답변

먼저 직렬화를 정의한 다음 이것이 왜 그렇게 유용한 지 이야기 할 수 있습니다.

직렬화는 단순히 기존 개체를 바이트 배열로 바꾸는 것입니다. 이 바이트 배열은 객체의 클래스, 객체의 버전 및 객체의 내부 상태를 나타냅니다. 이 바이트 배열은 객체를 전송 / 읽기 위해 동일한 코드를 실행하는 JVM간에 사용될 수 있습니다.

왜 우리가 이것을하고 싶습니까?

몇 가지 이유가 있습니다.

  • 통신 : 동일한 코드를 실행하는 두 대의 컴퓨터가 있고 통신이 필요한 경우 한 컴퓨터가 전송하려는 정보로 개체를 만든 다음 해당 개체를 다른 컴퓨터에 직렬화하는 쉬운 방법입니다. 의사 소통을위한 최선의 방법은 아니지만 작업을 완료합니다.

  • 지속성 : 특정 작업의 상태를 데이터베이스에 저장하려는 경우 쉽게 바이트 배열로 직렬화하고 나중에 검색 할 수 있도록 데이터베이스에 저장할 수 있습니다.

  • Deep Copy : Object 의 정확한 복제본 이 필요하고 고유 한 clone () 클래스를 작성하는 데 어려움을 겪고 싶지 않은 경우 객체를 바이트 배열로 직렬화 한 다음 다른 객체로 직렬화 해제하기 만하면됩니다. 개체는이 목표를 달성합니다.

  • 캐싱 : 실제로는 위의 애플리케이션 일 뿐이지 만 때로는 객체를 빌드하는 데 10 분이 걸리지 만 직렬화 해제하는 데 10 초 밖에 걸리지 않습니다. 따라서 메모리에있는 거대한 객체를 유지하는 대신 직렬화를 통해 파일에 캐시하고 나중에 필요할 때 읽어들입니다.

  • 교차 JVM 동기화 : 직렬화는 다른 아키텍처에서 실행될 수있는 여러 JVM에서 작동합니다.


답변

애플리케이션을 실행하는 동안 모든 개체는 메모리 (RAM)에 저장됩니다. 종료하면 해당 메모리가 운영 체제에 의해 회수되고 프로그램은 기본적으로 실행 중 발생한 모든 것을 ‘잊습니다’. 직렬화는 응용 프로그램이 개체를 디스크에 저장하여 다음에 시작할 때 다시 읽을 수 있도록하여이 문제를 해결합니다. 애플리케이션이 이전 상태를 저장 / 공유하는 방법을 제공하려는 경우 일련의 형식이 필요합니다.


답변

제 이야기를 공유 할 수 있고 연재가 필요한 이유에 대한 아이디어를 얻을 수 있기를 바랍니다. 그러나 귀하의 질문에 대한 답변은 이미 매우 상세합니다.

여러 개의 텍스트 파일을로드하고 읽어야하는 프로젝트가 여러 개있었습니다. 파일에는 불용어, 생물 의학 동사, 생물 의학 약어, 의미 상 서로 연결된 단어 등이 포함되어 있습니다. 이러한 파일의 내용은 간단합니다. 단어 !

이제 각 프로젝트에 대해 이러한 각 파일에서 단어를 읽고 다른 배열에 넣어야했습니다. 파일의 내용이 변경되지 않았기 때문에 첫 번째 프로젝트 이후에 중복되는 공통 작업이되었습니다.

그래서 제가 한 것은 각각의 파일을 읽고 개별 배열 (객체의 인스턴스 변수)을 채우기 위해 하나의 객체를 생성 한 것입니다. 그런 다음 개체를 직렬화 한 다음 이후 프로젝트에서는 간단히 역 직렬화했습니다. 파일을 읽고 배열을 반복해서 채울 필요가 없었습니다.


답변

본질적으로 :

직렬화는 서로에 대한 참조를 포함하는 객체 인스턴스 집합을 바이트의 선형 스트림으로 변환하는 프로세스입니다. 그런 다음 소켓을 통해 보내거나 파일에 저장하거나 단순히 데이터 스트림으로 조작 할 수 있습니다.

Wiki 에서 사용보기 :

직렬화에는 여러 가지 장점이 있습니다. 다음을 제공합니다.

  1. 디스크의 텍스트 파일에 속성을 쓰는 것보다 더 편리한 객체를 유지하고 이것을 다시 읽어서 다시 조립하는 방법입니다.
  2. 원격 절차 호출을 발행하는 방법, 예를 들어 SOAP에서
  3. 특히 COM, CORBA 등과 같은 소프트웨어 구성 요소에서 개체를 배포하는 방법입니다.
  4. 시간에 따라 변화하는 데이터의 변화를 감지하는 방법.

답변

가장 분명한 것은 네트워크를 통해 직렬화 된 클래스를 전송할 수 있고 수신자가 원래 인스턴스의 복제본을 구성 할 수 있다는 것입니다. 마찬가지로 직렬화 된 구조를 파일 시스템에 저장할 수 있습니다.

또한 직렬화는 재귀 적이므로 원하는 경우 한 번에 전체 이기종 데이터 구조를 직렬화 할 수 있습니다.


답변

직렬화 된 객체는 공간에서 상태를 유지하고 네트워크, 파일 시스템 등을 통해 전송 될 수 있으며 시간이 지나면 객체를 생성 한 JVM보다 오래 지속될 수 있습니다.

때때로 이것은 유용합니다.


답변

직렬화 된 객체를 사용하여 함수 나 클래스 생성자에 전달하는 인수를 표준화합니다. 직렬화 된 하나의 빈을 전달하는 것은 긴 인수 목록보다 훨씬 더 깔끔합니다. 그 결과 더 쉽게 읽고 디버깅 할 수있는 코드가 생성됩니다.