Java 직렬화 인터뷰 질문 및 답변 [초보자 및 경험자용]

게시 됨: 2020-09-25

Java는 세계에서 가장 우수한 프로그래밍 언어 중 하나입니다. 우리는 시간이 지남에 따라 Java가 발전하고 오늘날 우리가 알고 있는 엄청나게 인기 있는 언어가 되는 것을 볼 만큼 충분히 운이 좋았습니다. Java에서 이루어진 이러한 개선으로 인해 오늘날 우리가 프로그램을 작성하는 방법을 정의하는 몇 가지 정말 중요한 기능이 포함되었습니다. 이러한 기능 중 하나는 직렬화입니다.

본질적으로 직렬화는 객체를 메모리에 저장하는 데 사용되는 메커니즘일 뿐입니다. 따라서 객체를 직렬화한다고 말할 때 문제의 객체를 상태에서 바이트 스트림으로 변환한다는 의미입니다. 기본 상태에서 바이트 스트림으로의 이러한 변환은 이 객체를 파일에 쓰기 쉽게 만듭니다.

이 파일은 우리가 원하는 곳 어디든지 전송될 수 있으며, 객체와 그 기능에 접근하기 위해 우리가 해야 할 일은 객체를 역직렬화하는 것뿐입니다. 역직렬화는 이름에서 알 수 있듯이 직렬화의 반대입니다. 여기에서 바이트의 스트림을 개체를 사용하기 위해 개체의 기본 상태로 변환합니다.

직렬화를 통해 개발자는 특정 수준의 유연성으로 코드를 작성할 수 있습니다. 개체를 가져와 다른 곳에서 기본 속성과 함께 사용하는 기능은 오늘날의 워크플로에서 매우 중요합니다. 채용 담당자가 잠재적 직원이 Java의 객체 직렬화에 대해 더 많이 알기를 바라는 것은 당연합니다.

프로젝트에서 직렬화를 사용했는지 여부에 관계없이 그 중요성을 그냥 지나칠 수 없습니다. 따라서 전문 Java 개발자가 되기 위한 노력에 도움이 되도록 아래에서 찾을 수 있는 몇 가지 매력적인 Java 직렬화 인터뷰 질문을 수집했습니다.

Java 직렬화 인터뷰 질문

Q1. Java 프로그래밍 언어의 맥락에서 직렬화란 무엇을 의미합니까?

앤. 직렬화의 정의는 아마도 가장 기본적이지만 Java 직렬화의 맥락에서 가장 자주 묻는 질문 중 하나일 것입니다. 거의 모든 인터뷰가 이 질문에 대답해야 합니다. 따라서 마음에 주입된 Java 직렬화에 대한 좋은 정의가 있어야 합니다. 따라서 직렬화는 Java로 작성된 객체가 바이트열 스트림으로 변환되는 방식에 불과합니다.

이것의 주요 목적은 객체가 다른 기계로 전송될 수 있도록 하거나 객체의 상태를 파일에 저장하거나 객체의 상태를 데이터베이스에 저장하는 것입니다. 객체가 성공적으로 직렬화되면 단순히 객체를 직렬화 해제하여 이전 영광으로 빠르게 객체를 다시 얻을 수 있습니다.

Q2. Java에서 객체를 직렬화할 수 있는 방법은 무엇입니까? 객체를 직렬화 및 역직렬화하는 프로그램을 작성하십시오.

앤. 인터뷰에서 프로그램 작성 능력으로 이론 지식을 보강할 수 있다면 자동으로 선택의 기회가 높아집니다. 또한 모든 인터뷰에서 직렬화 및 역직렬화가 발생하는 방법을 보여주는 기본 프로그램(최소한 기본 프로그램)을 작성해야 합니다. 이 프로그램을 직접 작성하기 전에 Java의 객체 직렬화에 대한 한 가지 핵심 사항을 기억해야 합니다.

객체를 직렬화하려면 java.io.Serializable 인터페이스를 사용하는 객체를 작성해야 합니다. 직렬화하려는 클래스의 객체에 대해 Marker 인터페이스를 사용하고 있는지 확인해야 합니다. 문제의 클래스에는 클래스에 작성된 메소드가 없어야 함을 의미합니다. 이 클래스는 또한 다음 개체가 형식을 변경하고 바이트 스트림을 형성해야 함을 Java Virtual Machine에 알려야 합니다.

직렬화를 위한 코드는 아래에 작성되어 있습니다.

OutputStream fout = 새로운 FileOutputStream("ser.txt");

ObjectOutput 출력 = 새로운 ObjectOutputStream(fout);

체계. out .println("직원 개체를 직렬화하는 직렬화 프로세스가 시작되었습니다...");

oout.writeObject(객체1);

역직렬화를 위한 코드는 아래에 작성되어 있습니다.

InputStream fin= new FileInputStream("ser.txt");

ObjectInput oin= 새로운 ObjectInputStream(fin);

체계. out .println("DeSerialization 프로세스가 시작되었습니다. 직원 개체를 표시합니다...");

직원 emp;

emp=(직원) oin.readObject();

학습: Java의 메모리 할당: 알아야 할 모든 것

Q3. 직렬화와 외부화 가능 인터페이스의 차이점은 무엇입니까?

앤. 이 질문은 당신이 그 직업에 선택되는지 아닌지의 차이를 의미할 수 있습니다. 매우 포괄적인 방식으로 이 질문에 답한다고 가정해 보겠습니다. 이 경우 면접관은 이 주제에 대한 귀하의 지식에 깊은 인상을 받을 수밖에 없으며 귀하의 선택 가능성은 자동으로 치솟습니다. 아래 표에서 모든 중요한 차이점을 찾을 수 있습니다.

이 두 가지 방법을 모두 비교하는 속성입니다.
직렬화 가능
외부화 가능
이 두 가지 다른 인터페이스의 클래스에 존재하는 메소드 이것은 마커 인터페이스로 발생합니다. 마커 인터페이스는 멤버 함수를 가질 수 없습니다. 이 클래스의 객체가 바이트 스트림으로 변환되어야 함을 Java Virtual Machine에 알려주는 명령어가 있어야 한다는 점을 제외하고는 비어 있어야 합니다. 이것은 일부 멤버 메소드가 있음을 의미하는 메이커 인터페이스가 아닙니다.

writeExternal() readExternal() 이라는 메서드가 있습니다 .

직렬화의 기본 방법은 무엇입니까? 직렬화 가능의 경우 작성하는 객체를 직렬화할 수 있는 기본 방법을 찾을 수 있습니다. 프로그래머로서 해야 할 일은 이 인터페이스를 프로그램에 통합할 수 있는 방법을 찾는 것뿐입니다. 직렬화를 구현할 수 있는 기본 방법을 찾을 수 없습니다. 고유한 방법을 작성하거나 기존 방법을 재정의해야 합니다.
직렬화 프로세스를 구현하는 방법은 무엇입니까? 이 인터페이스에서 직렬화가 구현되는 방식을 사용자 정의할 수 있습니다. 그러나 기존 메서드를 재정의할 수는 없습니다. 원하는 자유도를 얻으려면 이러한 메서드를 자신의 클래스에 구현해야 합니다. 이 방법에서는 기본 방법을 재정의해야 합니다. 따라서 개체를 직렬화하는 사용자 정의 방법을 구현하려면 기본 직렬화 방법보다 이 인터페이스를 선택해야 합니다.
직렬화 과정에서 제공하는 제어의 정도는 무엇입니까? 이 인터페이스를 사용할 때 작은 흔들림 공간을 찾을 수 있습니다. 또한 이 방법을 최대한 활용하려면 기본 함수를 클래스에 작성해야 합니다. 그러나 반드시 그렇게 해야 하는 것은 아닙니다. 즉, 사용자 정의 클래스에 기본 기능을 작성하지 않고도 이 인터페이스로 객체를 직렬화할 수 있습니다. 이 인터페이스는 전체 프로세스에 대한 탁월한 제어를 제공합니다. 그 이유만으로도 이 인터페이스를 사용하는 경우 사용자 정의 클래스에 두 가지 메소드를 작성해야 합니다.
역 직렬화를 사용하는 동안 사용되는 생성자는 무엇입니까? 직렬화 과정에서 호출되는 생성자가 없습니다. 이 인터페이스를 사용하여 개체를 직렬화할 때 계약자에 대한 호출이 있습니다.

Q4. 직렬화 및 역직렬화의 사용자 정의 프로세스를 구현하는 프로그램을 작성하십시오.

앤. 여기에서 까다로운 부분이 나옵니다. 실제 사용 사례 시나리오를 통해 이전 질문 지식을 모두 보여줄 수 있는 질문입니다. 이러한 프로그램을 작성할 수 있는 능력은 귀하의 전문 지식을 명확하게 보여주고 원하는 직업을 얻는 데 도움이 됩니다.

아래에서 writeObject() 메서드를 작성하는 사용자 지정 방법을 찾을 수 있습니다.

개인 무효 writeObject(ObjectOutputStream OS) {

체계. out .println("In, writeObject() 메서드입니다.");

시도 {

os.writeInt( .id);

os.writeObject( .이름 );

} catch (예외 e) {

e.printStackTrace();

}

}

아래에서 직렬화 해제의 사용자 정의 구현을 찾을 수 있습니다.

개인 무효 readObject(ObjectInputStream ois) {

체계. out .println("In, readObject() 메서드입니다.");

시도 {

아이디=ois.readInt();

이름=(문자열)ois.readObject();

} catch (예외 e) {

e.printStackTrace();

}

}

Q5. Externalizable 인터페이스를 사용하여 직렬화 및 역직렬화를 어떻게 구현합니까?

앤. 외부화 가능 인터페이스를 사용하여 직렬화 및 역직렬화를 구현하려면 writeExternal() 및 readExternal() 함수를 직접 작성해야 합니다. 아래에 작성된 두 코드에 대한 코드를 찾을 수 있습니다.

writeExternal() 메서드 사용자 지정

공공의 무효의 writeExternal (ObjectOutput oo) 에서 IOException이 발생합니다. {

체계. out .println("writeExternal()에서");

oo.writeInt(아이디);

oo.writeObject(이름);

}

readExternal() 메서드 사용자 지정

공공의 무효의 readExternal (ObjectInput 입력)에서 IOException , ClassNotFoundException { 이 발생합니다.

체계. out .println("in readExternal()");

.id=in.readInt();

.name=(String)in.readObject();

}

읽어보기: 2020년 Python 대 Java: 어느 것을 선택해야 합니까?

Q6. 특정 변수가 직렬화되는 것을 원하지 않는다고 가정해 보겠습니다. 직렬화를 원하지 않는 멤버 변수를 방지하려면 어떻게 하시겠습니까?

앤. 매우 개념적인 질문입니다. 이 질문에 빠르게 답하려면 정적 및 비정적 변수에 대한 지식이 필요합니다. 특정 변수가 직렬화되지 않기를 원한다고 가정합니다. 이 경우 정적 변수의 값을 변경할 수 없으므로 정적 변수로 만들어야 하며 이러한 이유로 직렬화되지 않습니다.

Q7. serialVersionUID는 무엇을 의미합니까?

앤. 직렬화하려는 모든 클래스에 대해 클래스 번호가 지정됩니다. 직렬화되는 모든 클래스에 부여되는 이 번호를 serialVersionUID라고 합니다. 이 ID는 개체를 기본 형식으로 되돌릴 때 Java Virtual Machine이 개체와 연결된 ID를 찾기 때문에 필수적입니다.

그런 다음 직렬화되어야 하는 클래스의 ID를 빠르게 참조합니다. 이 개체가 속한 해당 클래스를 찾으면 직렬화 해제 프로세스가 시작됩니다.

Q8. serialVersionUID를 언급하거나 정의하는 것을 잊었다고 가정해 보겠습니다. 이 조치가 우리가 작성한 프로그램에 미치는 영향은 무엇입니까?

앤. 이 질문은 또 다른 근본적인 질문입니다. 이 질문에 올바르게 대답하려면 건전한 지식이 필요합니다. 우리가 명확히 해야 할 첫 번째 사항은 serialVersionUID가 질문에서 개체의 버전 제어를 수행하는 데 사용된다는 것입니다. 클래스에 대해 정의된 ID가 없다고 가정해 보겠습니다. 따라서 Java 컴파일러는 객체가 속한 클래스를 알지 못합니다. 런타임 시 또는 개체를 직렬화할 때 정의할 ID 자체가 필요하지 않기 때문에 오류가 발생하지 않습니다.

그러나 데이터 스트림을 개체로 변환하려는 경우 Java 컴파일러에서 오류가 발생합니다. 컴파일러는 개체가 속한 클래스를 알지 못하므로 이 개체와 연결된 모든 멤버 함수 및 변수를 찾아 연결할 수 없습니다. 컴파일러는 이 단계에서 멈추기 때문에 serialVersionUID 불일치(java.io.InvalidClassException) 오류가 발생합니다.

Q9. 직렬화할 수 없거나 직렬화 방법을 사용할 수 없는 경우 작성한 객체를 네트워크를 통해 전송할 수 있는 다른 방법이 있습니까?

앤. 네트워크를 통해 작성한 객체를 전송할 수 있는 몇 가지 방법이 있습니다. 그 중 일부는 아래에 나열되어 있습니다.

  1. 객체를 JSON 파일로 변환할 수 있습니다. 객체를 JSON 문자열로 변환하는 것은 그리 어렵지 않고, JSON 파일을 작성했을 때 코드 파일로 변환하는 것도 그리 어렵지 않다. 따라서 네트워크를 통해 작성한 JSON 문자열을 전송할 수 있습니다.
  2. Hibernate 도구(ORM 도구)를 사용할 수도 있습니다. 이 도구를 사용하면 개체를 데이터베이스에 유지할 수 있습니다. 그러면 작성된 대상도 나중에 매우 쉽게 읽을 수 있습니다.
  3. XML 기술을 사용할 수도 있습니다. 개체를 XML 파일로 변환한 다음 네트워크를 통해 해당 파일을 빠르게 전송할 수 있습니다.

반드시 읽어야 함: 상위 24개 Java 인터뷰 질문 및 답변

마무리

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

미래의 직업을 위한 준비

업계에서 신뢰할 수 있는 학습 - 업계에서 인정하는 인증.
오늘 등록