Java에서 Java.IO.NotSerializableException 수정

Mehvish Ashiq 2023년10월12일
  1. Java에서 java.io.NotSerializableException 재현
  2. Java에서 java.io.NotSerializableException의 원인
  3. Java에서 java.io.NotSerializableException 수정
Java에서 Java.IO.NotSerializableException 수정

오늘은 Java로 프로그램을 작성하면서 발생하는 java.io.NotSerializableException을 재현해 보겠습니다. 또한 이 오류의 의미를 이해하여 원인과 해결 방법을 안내합니다.

Java에서 java.io.NotSerializableException 재현

예제 코드(Student.java 파일):

package com.serializertest;

class Student {
  private String studentId;

  public String getId() {
    return studentId;
  }
  public void setId(String id) {
    this.studentId = id;
  }
}

Student 클래스는 studentId라는 멤버 변수가 있는 도우미 클래스입니다. 또한 학생의 id를 가져오고 설정하기 위한 getId()setId()라는 멤버 메서드가 있습니다.

예제 코드(SerializerTest.java 파일):

package com.serializertest;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class SerializerTest {
  public static void main(String[] args) throws IOException {
    FileOutputStream fileOutputStream = new FileOutputStream("students.txt");
    ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);

    Student student = new Student();
    student.setId("0001");

    objectOutputStream.writeObject(student);
    objectOutputStream.close();
  }
}

SerializerTestmain() 드라이버 메서드가 있는 기본 클래스입니다. main() 내부에서 FileOutputStream 클래스의 인스턴스를 생성하여 파일을 생성합니다.

마찬가지로 ObjectOutputStream 클래스의 다른 인스턴스를 만듭니다.

그런 다음 Student 클래스의 개체를 만들고 문자열 인수를 전달하여 setId() 메서드를 호출합니다. 다음으로 ObjectOutputStream 클래스의 개체를 사용하여 개체를 스트림에 씁니다.

이를 위해 writeObject() 메서드를 사용하고 있습니다.

그런 다음 close() 메서드를 사용하여 스트림을 닫고 프로그램을 실행하지만 프로그램의 출력 콘솔에 다음과 같은 예외가 표시됩니다.

Exception in thread "main" java.io.NotSerializableException: com.serializertest.Student

왜 우리는 이것을 직면하고 있습니까? 아래에서 그 원인을 찾기 위해 오류를 이해합시다.

Java에서 java.io.NotSerializableException의 원인

원인을 찾기 위해서는 NotSerializableExceptionSerialization을 이해하는 것이 필수적입니다.

‘직렬화’는 개체의 상태를 바이트 스트림에 쓰는 데 사용하는 Java 프로그래밍의 메커니즘입니다. 반대로 역직렬화(Deserialization)라고 합니다.

SerializationDeserialization은 플랫폼 독립적입니다. 이는 두 프로세스가 서로 다른 플랫폼에서 수행될 수 있음을 의미합니다.

우리는 Remote Method Invocation(RMI) 및 Enterprise Java Beans(EJB)에서 Serialization을 사용합니다. Java Persistence API(JPA), Hibernate 등에서도 사용됩니다.

NotSerializableExceptionObjectStreamException 클래스를 확장하는 예외이며 객체 스트림 클래스에 특정한 다른 모든 예외의 상위 클래스로 정의됩니다.

또한 ObjectStreamExceptionIOException을 확장하여 I/O 예외가 생성되었음을 추가로 알립니다.

이제 우리는 Java에서 SerializationNotSerializableException을 알고 있습니다. 이 토론을 통해 Java에서 NotSerializableException의 이유를 발견할 수 있습니다.

  1. 클래스의 인스턴스가 Serializable 인터페이스를 구현해야 하는 경우 NotSerializableException이 발생합니다.
  2. 또한 클래스의 인스턴스 또는 직렬화 런타임에 의해 이 예외가 발생합니다. NotSerializableException의 인수는 클래스의 이름임을 기억하십시오.
  3. 문서에 따라 전체 객체 그래프는 직렬화 가능해야 합니다. NotSerializableException은 클래스의 인스턴스를 직렬화하려고 시도하는 동안 필드 중 하나 이상이 Serializable 인터페이스를 구현하지 않는 경우에도 발생합니다.

Java에서 java.io.NotSerializableException 수정

다음 솔루션을 사용하여 Java에서 java.io.NotSerializableException을 수정할 수 있습니다.

  1. 이 예외를 throw하는 클래스를 찾고 Serializable 인터페이스를 구현하여 Serializable로 만듭니다. NotSerializableException을 발생시키는 클래스가 타사 라이브러리에 속하는 경우 이 솔루션은 좋은 선택이 아닐 수 있습니다.

  2. 클래스가 이러한 개체를 직렬화할 수 없는 직렬화할 수 없는 개체를 참조하는 경우 개체를 일시적으로 선언할 수 있습니다. 문제는 왜 그것을 일시적으로 선언하는가입니다.

    transient로 선언된 클래스의 필드가 직렬화 가능 런타임에 의해 무시되고 예외가 발생하지 않기 때문입니다.

  3. 데이터와 타사가 필요한 경우 다른 직렬화 방법을 고려할 수 있습니다. 예를 들어 정의를 변경하지 않고 직렬화된 타사 개체를 가져올 수 있는 XML, JSON 등이 있습니다.

우리의 경우 Serializable을 구현하면 java.io.NotSerializableException이 수정되었습니다. 다음 예제 코드를 참조하십시오.

예제 코드(Students.java 파일):

package com.serializertest;

import java.io.Serializable;

class Student implements Serializable {
  private String studentId;

  public String getId() {
    return studentId;
  }
  public void setId(String id) {
    this.studentId = id;
  }
}

예제 코드(SerializerTest.java 파일):

package com.serializertest;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class SerializerTest {
  public static void main(String[] args) throws IOException {
    FileOutputStream fileOutputStream = new FileOutputStream("students.txt");
    ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);

    Student student = new Student();
    student.setId("0001");

    objectOutputStream.writeObject(student);
    objectOutputStream.close();
  }
}
Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook

관련 문장 - Java Error