Java 직렬화: 알아야 할 모든 것 [2022]

게시 됨: 2021-01-04

IT 산업의 폭발적인 성장과 함께 IT에 대한 의존도는 날이 갈수록 높아지고 있는 것 같습니다. 이러한 꾸준한 성장으로 인해 많은 실무 전문가들이 업계 내에서 관련성을 유지하기 위해 프로그래밍 언어를 사용하게 되었습니다. 업계에서는 고객에게 서비스를 제공하기 위해 여러 언어를 사용하지만 몇 가지 언어가 다른 언어보다 더 자주 사용됩니다. Java는 그러한 언어 중 하나입니다.

신입이든 베테랑이든 관계없이 Java에 대한 건전한 지식은 소프트웨어 여정의 모든 단계에서 도움이 될 것입니다. 다른 프로그래밍 언어와 마찬가지로 Java도 자체적으로 포괄적인 강의를 제공합니다. 언어를 구두점으로 만드는 다양한 개념을 모두 이해하려면 매일 언어를 연습해야 합니다. 사용자에게 많은 도움이 되는 개념 중 하나는 Java에서 직렬화를 실행하는 것입니다.

목차

소개

Java 컨텍스트에서 직렬화는 Java 코드 개체가 바이트 스트림으로 체계적으로 변환되는 프로세스를 나타냅니다. 이것은 하나의 Java 가상 머신에서 다른 가상 머신으로 해당 오브젝트 코드를 효율적으로 전송할 수 있도록 하기 위해 수행됩니다. 결과적으로 이것은 역직렬화의 도움으로 재생성할 수 있습니다. 우리는 여러 목표를 달성하기 위해 직렬화를 사용합니다. 아래 섹션에서 가장 인기 있고 관련성이 높은 항목을 살펴보겠습니다.

직렬화가 사용되는 이유는 무엇입니까?

객체를 바이트 시퀀스로 표현하는 현상은 프로그래밍 패러다임 내에서 공정하게 사용됩니다. 프로세스가 개체의 데이터를 나타내는 것으로 확장되면 유틸리티가 몇 배로 증가합니다. 다음은 Java에서 직렬화의 가장 일반적인 용도 중 일부입니다.

의사 소통

Java의 직렬화는 여러 컴퓨터 시스템 간의 효과적이고 신속한 통신을 허용합니다. 이러한 장치는 객체 직렬화 및 전송을 사용하여 다양한 객체의 동시 공유 및 설계를 용이하게 합니다. 결과적으로 결과적으로도 원활하게 실행됩니다. 방대한 데이터베이스의 경우 직렬화를 통해 개체 처리에 대한 매우 간소화된 접근 방식을 사용할 수 있습니다.

캐싱

더 넓은 의미에서 캐싱은 정보에 최소한의 시간을 투자하여 나중에 액세스할 수 있도록 정보를 저장하는 방법을 말합니다. Java의 직렬화는 큰 개체를 역직렬화하는 데 소요되는 시간을 최소화하여 캐싱을 프롬프트합니다. 역직렬화에 걸리는 시간에 비해 객체를 빌드하는 데 걸리는 시간이 훨씬 더 많다는 것은 상식입니다. 따라서 직렬화는 혼합에서 상대적으로 더 큰 개체를 캐싱하여 이 시간 소비를 최적화하는 데 도움이 됩니다.

딥 카피

Java의 딥 카피는 변경의 대상이 될 수 있는 이전 버전에 종속되지 않는 방식으로 트리에서 객체를 복사하는 프로세스를 나타냅니다. 직렬화를 채택하면 이 복제 프로세스가 훨씬 쉬워집니다. 개체를 바이트 배열로 직렬화한 다음 역직렬화함으로써 사용자는 해당 개체의 복제본을 얻을 수 있습니다.

교차 Java 가상 머신 동기화

직렬화를 실행하는 주요 이점은 사용자가 여러 JVM에서 작업할 수 있다는 사실에 있습니다. 직렬화가 채택되면 이러한 JVM이 동일하거나 다른 아키텍처 및 운영 체제에서 작동하는지 여부는 중요하지 않습니다.

고집

객체에 직렬화를 적용하면 불편함 없이 아이템의 상태를 직접 저장할 수 있다. 또한 사용자가 언급된 상태를 나중에 언제든지 검색할 수 있는 데이터베이스에 저장할 수 있습니다.

읽기: Java 직렬화 인터뷰 질문 및 답변

객체 직렬화 - 관련 프로세스

객체 직렬화를 진행하기 전에 먼저 직렬화 가능한지 여부를 먼저 설정해야 합니다. 이제 어떻게 결정합니까? Java의 객체는 해당 클래스 또는 상위 클래스가 java.io.Serializable 인터페이스의 구현을 허용하는 경우에만 직렬화 가능합니다. 이러한 클래스가 하위 인터페이스인 java.io.Externalizable도 구현하는 경우에도 기준이 충족됩니다.

위에서 논의한 것처럼 교차 JVM 동기화는 직렬화를 사용하는 가장 강력한 응용 프로그램 중 하나입니다. 객체를 직렬화할 때 이 객체의 상태를 바이트 스트림으로 변환합니다. 결과적으로 한 Java 가상 머신에서 다른 가상 머신으로 객체를 전송할 수 있게 되었습니다. 결과적으로 이 바이트 스트림도 원래 객체로 다시 변환될 수 있습니다.

이 변환을 역직렬화라고도 합니다. 이전에 직렬화한 송신자로부터의 객체의 바이트 스트림을 수신측에서 재생성하는 직렬화의 역과정이다.

자바 직렬화의 장점

이전 섹션에서 직렬화의 용도와 적용을 논의하면서 우리는 이미 직렬화의 다양한 장점에 대해 몇 가지 조명했습니다. 이제 그들에 대해 더 깊이 알아볼 시간입니다.

  • 직렬화의 가장 중요한 이점 중 하나는 이것이 내장 기능이라는 사실입니다. 직렬화를 구현하거나 실행하기 위해 타사 소프트웨어의 도움을 받을 필요가 없습니다.
  • 초보자이자 이제 막 배운 지식을 가진 사용자에게도 직렬화는 배우고 이해하기가 상당히 쉬운 과정입니다.
  • 종종 다른 프로그래밍 배경을 가진 개발자가 새로운 언어의 뉘앙스를 처리해야 할 때 터치 배경을 얻습니다. 그러나 직렬화의 경우 프로세스는 보편적이므로 모든 개발자에게 친숙합니다.
  • 사용 및 구현이 간편할 뿐만 아니라 사용자 정의도 용이합니다.
  • 현재 작업에 직렬화를 사용하는 중요한 기술이 많이 있습니다. 직렬화된 데이터 스트림이 암호화, 인증, 압축 및 보안 Java 컴퓨팅을 지원하기 때문입니다.

Java 직렬화의 단점

어떤 프로그래밍 언어도 100% 완벽하지 않으며 그렇다고 주장할 수도 없습니다. 결과적으로, 그것들을 구성하는 개념들과 과정들 역시 그들 나름의 결점이 없는 것은 아니다. 다음은 직렬화 프로세스와 관련된 몇 가지 일반적인 단점입니다.

  • 일부 직렬화 프로세스에서는 직렬화도 함께 적용해야 합니다. 이제 역직렬화를 적용할 때의 단점은 개체를 부서지기 쉽게 만든다는 것입니다. 결과적으로 해당 개체가 효과적으로 역직렬화될 것이라는 완전한 확신은 없습니다.
  • 직렬화 프로세스가 호출되면 일시적인 변수가 많이 생성됩니다. 이러한 임시 변수는 생성될 때 추가 메모리 공간을 차지합니다. 그러나 이러한 프로세스 중에 생성자가 호출되지 않기 때문에 이러한 임시 변수가 많이 초기화되지 않습니다. 결과적으로 표준 Java Flow의 변형에 영향을 미치게 됩니다.
  • 모든 시간 소비 최적화를 위해 직렬화 프로세스는 메모리 활용과 관련하여 점점 더 비효율적입니다.
  • 직렬화 프로세스는 모든 Java Standard Edition마다 전환 제어 메커니즘을 제공하지 않습니다. 따라서 타사 API 없이 병렬 액세스가 필요한 응용 프로그램과 함께 사용하는 것은 바람직하지 않습니다.
  • 직렬화를 사용하는 동안 개체에 액세스하기 위해 세분화된 제어를 얻기 위해 종종 타협해야 합니다.

실용 렌즈로 본 직렬화

지금까지 직렬화 과정을 다양한 장점과 단점을 포함하여 이론적 개념으로 논의했습니다. 이제 실용적인 관점에서 직렬화와 직렬화의 구현을 시각화할 수 있는 토론을 탐구할 때입니다. 다음은 직렬화의 실제 구현을 이해하는 데 도움이 되는 몇 가지 사례입니다.

반드시 읽어야 함: JavaBeans 속성 및 이점: 어떻게 활용해야 합니까?

직렬화 및 상속

Java에서 상속은 한 클래스가 다른 클래스의 메소드와 필드를 획득하거나 상속하는 현상으로 광범위하게 정의됩니다. 속성을 상속하는 클래스를 하위 클래스라고 하고 속성이 상속되는 클래스를 슈퍼 클래스라고 합니다. 수퍼 클래스라는 용어는 기본 클래스 및 상위 클래스와도 같은 의미로 사용됩니다.

우리의 첫 번째 사례는 슈퍼클래스의 맥락에서 직렬화를 다룹니다. 일반적으로 수퍼 클래스가 직렬화 가능하면 해당 하위 클래스도 기본적으로 직렬화 가능한 것으로 간주될 수 있습니다. 물론 이것은 슈퍼클래스가 Serializable 인터페이스를 구현하는 경우에만 해당됩니다. 그러나 슈퍼클래스가 Serializable 인터페이스를 구현하지 않은 경우에도 서브클래스를 직렬화할 수 있는 경우도 있습니다.

이것은 하위 클래스가 하나의 용량으로 직렬화 가능 인터페이스를 구현하도록 관리할 때 발생합니다. 슈퍼클래스가 어떤 상황에서도 Serializable 인터페이스를 구현하지 못하는 경우, 서브클래스 자체가 직렬화 가능한 인터페이스를 구현할 때 서브클래스의 객체를 수동으로 직렬화할 수 있습니다.

때때로 사용자는 세 번째 가능성에 부딪힐 수도 있습니다. 이 가능성은 슈퍼클래스가 직렬화 가능하지만 사용자가 서브클래스와 관련하여 프로세스를 채택할 필요가 없을 때 발생합니다.

이와 같은 상황에서 하위 클래스의 원치 않는 직렬화를 의식적으로 방지할 수 있는 방법이 있습니다. 이것은 서브클래스에서 writeObject() 및 readObject() 메소드를 구현하여 수행할 수 있습니다. 그러나 이러한 방법을 구현하는 것만으로는 충분하지 않습니다. 이러한 메서드를 작성하는 것과 함께 사용자는 해당 메서드가 구현에서 NotSerializableException을 throw하지 않도록 해야 합니다.

정적 멤버의 도움으로 직렬화

직렬화 프로세스가 구현되면 프로세스의 정적 필드 구성원을 무시하게 됩니다. 이는 주로 절차로서의 직렬화가 해당 객체의 최신 상태와 관련이 있기 때문입니다. 결과적으로 클래스의 특정 인스턴스와 연결된 데이터는 성공적으로 직렬화되지만 이와 관련된 정적 멤버 필드는 직렬화되지 않습니다.

XML 문서에 대한 직렬화

Java 객체를 XML로 직렬화하는 것은 여러 가지 방법으로 달성할 수 있습니다. 주로 XMLEncoder 및 XMLDecoder의 도움으로 구현됩니다. Java 객체를 XML 문서로 직렬화하는 주요 목적은 직렬화 프로세스가 본질적으로 수반하는 다양한 단점을 제한하는 데 있습니다.

직렬화 과정에서 가장 관련 있는 문제 중 하나는 직렬화된 객체를 저장하고 복원하는 논리가 구성 클래스의 내부 구조에만 기반한다는 것입니다. 개체를 저장하고 검색하는 사이에 경과된 시간 동안 해당 클래스에 발생했을 수 있는 변경 사항을 고려하지 않습니다. 결과적으로 이것은 역직렬화 프로세스의 임박한 실패를 초래합니다.

직렬화는 버전 문제도 발생시킵니다. 이것은 사용자가 클래스의 한 버전을 사용하여 개체를 저장하지만 다른 버전 또는 새 버전의 클래스를 사용하여 동일한 클래스를 역직렬화하려고 할 때 발생합니다. 이 경우 역직렬화 프로세스도 실패합니다.

따라서 이러한 모든 문제를 피하기 위해 일부 사용자는 개체를 바이너리 형식으로 직렬화하는 기존 접근 방식보다 XML 문서로 개체를 직렬화하는 것을 선호합니다. 또한 Java 객체를 XML 문서로 직렬화하면 객체가 사람이 읽을 수 있게 되어 훨씬 더 편리합니다.

체크아웃: Java 인터뷰 질문 및 답변

외부화 가능한 인터페이스 이해하기

Java의 Externalizable 인터페이스는 직렬화 인터페이스와 매우 유사합니다. 차이점은 맞춤형 직렬화를 제공하는 능력에 있습니다. 외부화 가능 인터페이스는 스트림에 저장하려는 객체를 선택할 수 있는 옵션을 제공하는 반면 직렬화 인터페이스는 동일한 권한을 부여하지 않습니다.

java.io에서 외부화 가능한 인터페이스를 사용할 수 있습니다. 외부화 가능한 인터페이스는 사용자에게 두 가지 방법도 제공합니다. 첫 번째는 public void writeExternal(ObjectOutput out)이 IOException을 던집니다. 다른 하나는 public void readExternal(ObjectOutput in)이 IOException을 던집니다.

직렬화와 외부화의 차이점

사용자 정의 직렬화를 제공하는 기능 외에도 일부 다른 주요 변수는 직렬화와 외부화를 구분합니다. 다음 부분에서는 이들을 자세히 살펴봅니다.

구현

직렬화 가능 인터페이스와 외부화 가능 인터페이스의 주요 차이점 중 하나는 구현에 있습니다. 외부화 가능 인터페이스는 사용자가 직렬화하려는 객체를 명시적으로 언급할 것으로 기대합니다. 직렬화 가능한 인터페이스를 다룰 때는 그렇지 않습니다. 직렬화 가능한 인터페이스에서 모든 개체와 변수는 런타임 동안 구분 없이 직렬화됩니다.

행동 양식

Externalizable 인터페이스는 크게 두 가지 방법으로 구성됩니다. writeExternal() 메서드와 readExternal() 메서드입니다. 반면 직렬화 가능한 인터페이스는 어떤 메서드도 포함하지 않습니다.

프로세스

외부화 가능한 인터페이스에서 직렬화 프로세스를 수행할 때 사용자 정의 직렬화 권한이 부여됩니다. 직렬화 가능한 인터페이스에서는 기본 직렬화 프로세스가 적용됩니다.

이전 버전과의 호환성 및 제어

Externalizable Interface는 문제의 버전 제어에 대한 예약 없이 직렬화를 지원합니다. 이 접근 방식의 유일한 문제는 사용자가 수퍼클래스를 직렬화하는 동안 스스로 책임져야 한다는 것입니다. 반대로 직렬화 인터페이스를 사용하려면 양쪽 끝에 동일한 버전의 JVM이 있어야 합니다. 그러나 슈퍼클래스도 포함하여 모든 객체와 클래스의 기본 직렬화를 허용합니다.

공개 No-Arg 생성자

직렬화된 객체를 재구성하는 동안 외부화 인터페이스는 인수가 없는 공용 생성자를 사용해야 합니다. 이것은 명시적으로 no-arg 생성자를 필요로 하지 않고 오히려 리플렉션을 사용하여 직렬화된 객체 및 클래스를 재구성하는 직렬화 인터페이스의 경우 다릅니다.

자바 직렬화: 논쟁

Java의 직렬화 개념과 관련하여 꽤 많은 논란이 있습니다. 그들 중 많은 사람들이 처음부터 절차로 직렬화를 제거하는 데 관심을 갖고 있습니다. Oracle의 설계자들은 1997년의 끔찍한 실수로 간주하여 Java에서 직렬화를 제거하는 것을 오랫동안 고려했다고 널리 알려져 있습니다.

그들의 연구에 따르면 직렬화 절차 설계의 결함은 데이터 자체에 위협이 될 정도입니다. 그 정도로, 1997년 Mark Reinhold는 모든 Java 취약점의 거의 1/3이 직렬화 프로세스에 기인한다고 밝혔습니다.

따라서 구성으로서의 직렬화가 향후 업데이트에서 Java 연대기에서 완전히 제거되거나 대체될 가능성이 높습니다. 이것은 또한 대다수의 전문가가 직렬화를 Java 초보자가 프로젝트에서 구현할 수 있는 이상적인 옵션으로 간주하지 않기 때문일 수도 있습니다.

또한 읽기: Java 프로젝트 아이디어 및 주제

세계 최고의 대학에서 소프트웨어 개발 과정받으십시오 . 이그 제 큐 티브 PG 프로그램, 고급 인증 프로그램 또는 석사 프로그램을 획득하여 경력을 빠르게 추적하십시오.

결론

직렬화에 대한 논의와 심의는 몇 가지 모범 사례에 대한 조명만으로는 결론을 내릴 수 없습니다. 다음은 최고의 경험을 보장하기 위해 사용자가 채택해야 하는 몇 가지입니다.

  • 직렬화 가능한 필드를 나타내려면 javadoc@serial 태그를 사용해야 합니다.
  • 직렬화된 개체를 나타내는 파일의 경우 .ser 확장자를 사용하는 것이 좋습니다.
  • 일반적으로 정적 또는 일시적 필드를 기본 직렬화에 적용하는 프로세스는 눈살을 찌푸리게 합니다.
  • 절대적으로 필수가 아닌 한 모든 상황에서 확장 가능한 클래스의 직렬화를 피해야 합니다.
  • 직렬화를 구현하는 동안 내부 클래스가 직렬화 프로세스에 관여하지 않도록 해야 합니다.

Java, OOP 및 전체 스택 소프트웨어 개발에 대해 자세히 알아보려면 작업 전문가를 위해 설계되었으며 500시간 이상의 엄격한 교육을 제공하는 upGrad & IIIT-B의 전체 스택 소프트웨어 개발 이그 제 큐 티브 PG 프로그램을 확인하십시오. 9개 이상의 프로젝트 및 과제, IIIT-B 동문 자격, 실질적인 실습 캡스톤 프로젝트 및 최고 기업과의 취업 지원

미래의 직업을 위한 준비

지금 소프트웨어 공학 석사 지원