Java에서 Java.IO.NotSerializableException 수정
-
Java에서
java.io.NotSerializableException
재현 -
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();
}
}
SerializerTest
는 main()
드라이버 메서드가 있는 기본 클래스입니다. main()
내부에서 FileOutputStream
클래스의 인스턴스를 생성하여 파일을 생성합니다.
마찬가지로 ObjectOutputStream
클래스의 다른 인스턴스를 만듭니다.
그런 다음 Student
클래스의 개체를 만들고 문자열 인수를 전달하여 setId()
메서드를 호출합니다. 다음으로 ObjectOutputStream
클래스의 개체를 사용하여 개체를 스트림에 씁니다.
이를 위해 writeObject()
메서드를 사용하고 있습니다.
그런 다음 close()
메서드를 사용하여 스트림을 닫고 프로그램을 실행하지만 프로그램의 출력 콘솔에 다음과 같은 예외
가 표시됩니다.
Exception in thread "main" java.io.NotSerializableException: com.serializertest.Student
왜 우리는 이것을 직면하고 있습니까? 아래에서 그 원인을 찾기 위해 오류를 이해합시다.
Java에서 java.io.NotSerializableException
의 원인
원인을 찾기 위해서는 NotSerializableException
과 Serialization
을 이해하는 것이 필수적입니다.
‘직렬화’는 개체의 상태를 바이트 스트림에 쓰는 데 사용하는 Java 프로그래밍의 메커니즘입니다. 반대로 역직렬화(Deserialization)라고 합니다.
Serialization
및 Deserialization
은 플랫폼 독립적입니다. 이는 두 프로세스가 서로 다른 플랫폼에서 수행될 수 있음을 의미합니다.
우리는 Remote Method Invocation(RMI
) 및 Enterprise Java Beans(EJB
)에서 Serialization
을 사용합니다. Java Persistence API(JPA
), Hibernate 등에서도 사용됩니다.
NotSerializableException
은 ObjectStreamException
클래스를 확장하는 예외이며 객체 스트림 클래스에 특정한 다른 모든 예외의 상위 클래스로 정의됩니다.
또한 ObjectStreamException
은 IOException
을 확장하여 I/O 예외가 생성되었음을 추가로 알립니다.
이제 우리는 Java에서 Serialization
및 NotSerializableException
을 알고 있습니다. 이 토론을 통해 Java에서 NotSerializableException
의 이유를 발견할 수 있습니다.
- 클래스의 인스턴스가
Serializable
인터페이스를 구현해야 하는 경우NotSerializableException
이 발생합니다. - 또한 클래스의 인스턴스 또는 직렬화 런타임에 의해 이 예외가 발생합니다.
NotSerializableException
의 인수는 클래스의 이름임을 기억하십시오. - 문서에 따라 전체 객체 그래프는 직렬화 가능해야 합니다.
NotSerializableException
은 클래스의 인스턴스를 직렬화하려고 시도하는 동안 필드 중 하나 이상이Serializable
인터페이스를 구현하지 않는 경우에도 발생합니다.
Java에서 java.io.NotSerializableException
수정
다음 솔루션을 사용하여 Java에서 java.io.NotSerializableException
을 수정할 수 있습니다.
-
이 예외를
throw
하는 클래스를 찾고Serializable
인터페이스를 구현하여Serializable
로 만듭니다.NotSerializableException
을 발생시키는 클래스가 타사 라이브러리에 속하는 경우 이 솔루션은 좋은 선택이 아닐 수 있습니다. -
클래스가 이러한 개체를 직렬화할 수 없는 직렬화할 수 없는 개체를 참조하는 경우 개체를
일시적
으로 선언할 수 있습니다. 문제는 왜 그것을일시적
으로 선언하는가입니다.transient
로 선언된 클래스의 필드가 직렬화 가능 런타임에 의해 무시되고 예외가 발생하지 않기 때문입니다. -
데이터와 타사가 필요한 경우 다른 직렬화 방법을 고려할 수 있습니다. 예를 들어 정의를 변경하지 않고 직렬화된 타사 개체를 가져올 수 있는 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();
}
}