developer tip

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

copycodes 2020. 8. 21. 07:59
반응형

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


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


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

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

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

몇 가지 이유가 있습니다.

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

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

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

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

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


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


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

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

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

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


본질적으로 :

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

Wiki의 용도보기 :

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

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

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

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


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

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


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


학습의 단순한 목적을 위해 (알고, 나는 학습이라고 말했고, 최고라고 말하지 않았거나, 좋은 것이라고 말하지는 않았지만, 단지 이해를 위해) 컴퓨터의 텍스트 파일에 데이터를 저장 한 다음 프로그램을 가질 수 있습니다. 그 정보를 읽고 파일에 따라 프로그램이 다르게 응답하도록 할 수 있습니다. 당신이 더 고급이라면 반드시 txt 파일 일 필요는 없지만 다른 것입니다.

반면에 직렬화는 컴퓨터 언어에 직접 입력합니다. 마치 프랑스어로 무언가를 말하고 프랑스어를 배우도록 강요 한 다음 모든 것을 번역하여 네이티브 스페인어로 저장하는 것이 아니라 스페인어로 무언가를 스페인어 컴퓨터에 말하고있는 것과 같습니다. 가장 기술 집약적 인 답변은 아니지만 공통 언어 형식으로 이해할 수있는 예제를 만들려고합니다.

직렬화도 더 빠릅니다. Java에서는 객체가 힙에서 처리되고 스택에서 기본 요소로 표시되는 것보다 훨씬 오래 걸리기 때문입니다. 속도, 속도, 속도. 프로그래머의 관점에서 볼 때 파일 처리가 적습니다.

참고 URL : https://stackoverflow.com/questions/2232759/what-is-the-purpose-of-serialization-in-java

반응형