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


105

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


10
그들의 주장에 대해 "설득력이 없었던"것은 무엇입니까? 그리고 왜 당신의 질문에 대한 답을 받아들이지 않았습니까?
아논.

8
그는 그들이 그의 질문에 대답을 "확신하지 못했습니다".
Anthony Forloney 2010

5
제공된 답변은 사실 정확했습니다. 그들이 당신을 위해 작동하지 않으면 댓글로 답장하고 무시하는 대신 해결하려고 노력한 다음 다른 사람들이 당신이 그렇게 올바르게 사용하고 있지 않다고 지적하면 불을 지르기 시작하십시오.
아논.

4
Anon은 중복 질문을 방지하여 사이트 품질에 기여하고 있습니다. 모두 똑같은 것을 묻는 다섯 가지 질문을 보는 것은 어리석은 일입니다. 답을 얻을 수 없다면, 때로는 그게 바로 그럴 수도 있습니다. 답변을 받았지만 작동하지 않는 것 같으면 의견으로 토론을 계속하십시오. 따라서 올바른 질문을하거나, 충분한 시간을 묻거나, 올바른 전문가의 시선을 사로 잡는 경우 마법처럼 답을 줄 마술 상자가 아닙니다.
Chris

1
(답변 수락) 또는 (댓글 게시 및 / 또는 필요하지 않은 이유를 설명하는 질문 수정).
아논.

답변:


182

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

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

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

몇 가지 이유가 있습니다.

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

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

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

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

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


62
도대체 무엇을 만드는 데 10 분이 걸리나요?
oxbow_lakes

2
내 요점은 (물론) 직렬화에 관련된 파일 I / O가 순수한 객체 생성 오버 헤드를 축소 할 가능성이 높다는 것입니다. 난 당신이 계산 뭔가에 대해 과학적인 모델링과 같은 매우 비싼 이야기 할 수 있지만 직렬화 그것 때문에 핸들 스키마 변경이 어려운되는 지속성에 대한 매우 가난한 메커니즘 가정
oxbow_lakes

11
@oxbow_lakes 빠른 검색을 위해 특정 데이터 집합의 인덱스를 유지하는 경우가 그 예입니다. 이와 같은 인덱스는 빌드하는 데 매우 오랜 시간이 걸릴 수 있지만 일단 빌드하면 비교적 빠르게 직렬화 / 비 직렬화 할 수 있습니다.
David

웹 앱 요청이 대상에 도달하기 전에 지구상의 모든 라우터를 통과해야하는 경우 가능한 가장 긴 경로를 사용하여 객체와 함께 반환됩니다. 예, 10 분 정도 걸릴 수 있습니다.
Vaibs

@Schmelter, 통신을위한 최선의 방법이 아닌 직렬화를 언급 했으므로 구현하기에 가장 적합한 방법은 무엇입니까?
Ashfaque Rifaye

58

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


2
그렇다면 파일에 데이터를 쓰고 필요할 때 다시 읽는 더 좋고 효율적인 방법 인 것 같습니다.
m_a_khan 2010

1
이것은 유일한 진짜 설명입니다. 나는 직렬화 하나의 다른 실제 응용 프로그램 생각할 수 없다
에밀리

짧고 달다. 완벽한 설명.
Yakhoob

21

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

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

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

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


1
그런 경우에 (직렬화를 사용하여) 바이트 배열 스트림에 저장해야하는 이유는 임시 필드를 사용하는 것보다 더 간단 할 수 있습니까?
kidnan1991 년

3

본질적으로 :

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

Wiki 에서 사용보기 :

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

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

1

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

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


0

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

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


이것은 또한 일부 텍스트를 포함하는 간단한 파일로 달성 할 수 있습니다. 직렬화 된 객체를 다시 읽고 텍스트 파일에 기록 된 객체의 상태를 읽는 것이 조금 더 쉽습니다. 맞습니까?
m_a_khan 2010

@m_a_khan : 와우. 네, 간단한 텍스트로 할 수 있습니다. 그러나 객체가 더 복잡해 지거나 구조 (구성, 상속)가 더 복잡해지면이를 수동으로 (해제) 마샬링하는 것이 번거로울 것입니다. 목록, 집합 및지도를 개체 구성원으로 가지고 있다고 상상해보십시오.
Dirk Schumacher

서로 다른 직렬화 체계를 쉽게 생각 해낼 수 있으며 실제로 많은 것이 존재합니다. 아주 좋은 이유로, 그들 중 누구도는 "간단한 텍스트"로, 일반적인 경우 발생하지 않습니다
데이비드 Soroko

0

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


1
제 생각에는 searialization과 단일 구성 개체를 매개 변수로 사용하는 것은 매우 직교합니다. 아마도 이것은 일반적인 사용 사례가 아닙니다.
Gábor Bakos 2014

0

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

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

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


평범한 영어로 표현하려고 시도하는 동안 유용한 방법으로 직렬화를 실제로 설명하지 않았습니다.
user3516726
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.