나는 Serialization에 대한 많은 기사를 읽고 그것이 얼마나 훌륭하고 훌륭하지만 어떤 주장도 충분히 설득력이 없었습니다. 누군가가 클래스를 직렬화하여 실제로 달성 할 수있는 것이 무엇인지 말해 줄 수 있는지 궁금합니다.
나는 Serialization에 대한 많은 기사를 읽고 그것이 얼마나 훌륭하고 훌륭하지만 어떤 주장도 충분히 설득력이 없었습니다. 누군가가 클래스를 직렬화하여 실제로 달성 할 수있는 것이 무엇인지 말해 줄 수 있는지 궁금합니다.
답변:
먼저 직렬화를 정의한 다음 이것이 왜 그렇게 유용한 지 이야기 할 수 있습니다.
직렬화는 단순히 기존 개체를 바이트 배열로 바꾸는 것입니다. 이 바이트 배열은 객체의 클래스, 객체의 버전 및 객체의 내부 상태를 나타냅니다. 이 바이트 배열은 객체를 전송 / 읽기 위해 동일한 코드를 실행하는 JVM간에 사용될 수 있습니다.
왜 우리가 이것을하고 싶습니까?
몇 가지 이유가 있습니다.
통신 : 동일한 코드를 실행하는 두 대의 컴퓨터가 있고 통신이 필요한 경우 한 컴퓨터가 전송하려는 정보로 개체를 만든 다음 해당 개체를 다른 컴퓨터에 직렬화하는 쉬운 방법입니다. 의사 소통을위한 최선의 방법은 아니지만 작업을 완료합니다.
지속성 : 특정 작업의 상태를 데이터베이스에 저장하려는 경우 쉽게 바이트 배열로 직렬화하고 나중에 검색 할 수 있도록 데이터베이스에 저장할 수 있습니다.
Deep Copy : Object 의 정확한 복제본 이 필요하고 고유 한 clone () 클래스를 작성하는 데 어려움을 겪고 싶지 않은 경우 객체를 바이트 배열로 직렬화 한 다음 다른 객체로 직렬화 해제하기 만하면됩니다. 개체는이 목표를 달성합니다.
캐싱 : 실제로는 위의 애플리케이션 일 뿐이지 만 때로는 객체를 빌드하는 데 10 분이 걸리지 만 직렬화 해제하는 데 10 초 밖에 걸리지 않습니다. 따라서 메모리에있는 거대한 객체를 유지하는 대신 직렬화를 통해 파일에 캐시하고 나중에 필요할 때 읽어들입니다.
교차 JVM 동기화 : 직렬화는 다른 아키텍처에서 실행될 수있는 여러 JVM에서 작동합니다.
애플리케이션을 실행하는 동안 모든 개체는 메모리 (RAM)에 저장됩니다. 종료하면 해당 메모리가 운영 체제에 의해 회수되고 프로그램은 기본적으로 실행 중 발생한 모든 것을 '잊습니다'. 직렬화는 응용 프로그램이 개체를 디스크에 저장하여 다음에 시작할 때 다시 읽을 수 있도록하여이 문제를 해결합니다. 애플리케이션이 이전 상태를 저장 / 공유하는 방법을 제공하려는 경우 일련의 형식이 필요합니다.
제 이야기를 공유 할 수 있고 연재가 필요한 이유에 대한 아이디어를 얻을 수 있기를 바랍니다. 그러나 귀하의 질문에 대한 답변은 이미 매우 상세합니다.
여러 개의 텍스트 파일을로드하고 읽어야하는 프로젝트가 여러 개있었습니다. 파일에는 불용어, 생물 의학 동사, 생물 의학 약어, 의미 상 서로 연결된 단어 등이 포함되어 있습니다. 이러한 파일의 내용은 간단합니다. 단어 !
이제 각 프로젝트에 대해 이러한 각 파일에서 단어를 읽고 다른 배열에 넣어야했습니다. 파일의 내용이 변경되지 않았기 때문에 첫 번째 프로젝트 이후에 중복되는 공통 작업이되었습니다.
그래서 제가 한 것은 각각의 파일을 읽고 개별 배열 (객체의 인스턴스 변수)을 채우기 위해 하나의 객체를 생성 한 것입니다. 그런 다음 개체를 직렬화 한 다음 이후 프로젝트에서는 간단히 역 직렬화했습니다. 파일을 읽고 배열을 반복해서 채울 필요가 없었습니다.
본질적으로 :
직렬화는 서로에 대한 참조를 포함하는 객체 인스턴스 집합을 바이트의 선형 스트림으로 변환하는 프로세스입니다. 그런 다음 소켓을 통해 보내거나 파일에 저장하거나 단순히 데이터 스트림으로 조작 할 수 있습니다.
Wiki 에서 사용보기 :
직렬화에는 여러 가지 장점이 있습니다. 다음을 제공합니다.
- 디스크의 텍스트 파일에 속성을 쓰는 것보다 더 편리한 객체를 유지하고 이것을 다시 읽어서 다시 조립하는 방법입니다.
- 원격 절차 호출을 발행하는 방법, 예를 들어 SOAP에서
- 특히 COM, CORBA 등과 같은 소프트웨어 구성 요소에서 개체를 배포하는 방법입니다.
- 시간에 따라 변화하는 데이터의 변화를 감지하는 방법.
직렬화 된 객체는 공간에서 상태를 유지하고 네트워크, 파일 시스템 등을 통해 전송 될 수 있으며 시간이 지나면 객체를 생성 한 JVM보다 오래 지속될 수 있습니다.
때때로 이것은 유용합니다.
직렬화 된 객체를 사용하여 함수 나 클래스 생성자에 전달하는 인수를 표준화합니다. 직렬화 된 하나의 빈을 전달하는 것은 긴 인수 목록보다 훨씬 더 깔끔합니다. 그 결과 더 쉽게 읽고 디버깅 할 수있는 코드가 생성됩니다.
학습의 단순한 목적을 위해 (알고, 나는 학습이라고 말했고, 최선을 다하거나, 좋은 것이라고 말하지는 않았지만, 단지 이해를 위해) 컴퓨터의 텍스트 파일에 데이터를 저장 한 다음 프로그램을 가질 수 있습니다. 그 정보를 읽고 파일에 따라 프로그램이 다르게 응답하도록 할 수 있습니다. 당신이 더 고급이라면 반드시 txt 파일 일 필요는 없지만 다른 것입니다.
반면에 직렬화는 컴퓨터 언어에 직접 입력합니다. 마치 프랑스어로 무언가를 말하고 프랑스어를 배우도록 강요 한 다음 모든 것을 번역하여 네이티브 스페인어로 저장하는 것이 아니라 스페인어로 무언가를 스페인어 컴퓨터에 말하고있는 것과 같습니다. 가장 기술 집약적 인 답변은 아니지만 공통 언어 형식으로 이해할 수있는 예제를 만들려고합니다.
직렬화도 더 빠릅니다. Java에서는 객체가 힙에서 처리되고 스택에서 기본 요소로 표시되는 것보다 훨씬 오래 걸리기 때문입니다. 속도, 속도, 속도. 프로그래머의 관점에서 볼 때 파일 처리가 적습니다.