예제가 있는 Java의 직렬화 가능한 인터페이스

게시 됨: 2021-11-29

Java는 Serializable 인터페이스가 하나인 여러 패키지를 제공합니다. Java 패키지 java.io 내에 존재하며 일종의 마커 인터페이스입니다. 마커 인터페이스로 정의하면 인터페이스에 메소드나 필드가 존재하지 않습니다. 따라서 클래스가 인터페이스를 구현할 때마다 인터페이스는 메서드를 구현하지 않아도 됩니다. 클래스는 인스턴스가 직렬화 또는 역직렬화되기를 원하는 경우 인터페이스를 구현합니다.

직렬화 메커니즘은 객체 상태를 바이트 스트림으로 변환하는 데 사용됩니다. 이 메커니즘은 ObjectOutputStream을 사용하여 수행됩니다. 역직렬화 프로세스는 직렬화 프로세스의 반대입니다. 이 경우 바이트 스트림은 Java의 객체로 다시 변환됩니다. ObjectInputStream은 역직렬화에 사용됩니다.

목차

직렬화

객체의 상태를 바이트 스트림으로 변환하는 것을 직렬화라고 합니다. 직렬화의 반대는 직렬화 해제입니다. Java의 객체는 정적 바이트 스트림으로 변환될 수 있습니다. 이 정적 스트림은 데이터베이스에 저장하거나 다른 네트워크로 전송할 수도 있습니다. 직렬화 프로세스는 인스턴스에 따라 다릅니다. 즉, 한 플랫폼에서 개체 직렬화를 수행한 다음 다른 플랫폼에서 개체 역직렬화를 수행할 수 있습니다. 특정 유형의 마커 인터페이스인 "Serializable"은 직렬화 프로세스를 위해 구현됩니다. 따라서 직렬화에 적합한 클래스, 즉 Java의 직렬화 가능 클래스 는 마커 인터페이스를 구현해야 합니다.

객체 상태를 바이트 스트림에 쓰는 이 메커니즘을 직렬화라고 합니다. 이 메커니즘은 주로 JMS, EJB, JPA, RMI 및 Hibernate 기술에서 사용됩니다.

ObjectInputStream 및 ObjectOutputStream은 java.io.InputStream 및 java.io.OutputStream을 확장하는 고급 클래스의 형태입니다. 기본 유형 및 개체 그래프는 바이트 단위로 ObjectOutputStream에 의해 OutputStream에 기록될 수 있습니다.

개울. 변환 결과 스트림은 ObjectInputStream을 통해 읽을 수 있습니다. 따라서 직렬화의 경우에는 ObjectOutputStream에서 writeObject() 메서드가 호출되고, 역직렬화의 경우에는 ObjectInputStream 클래스에서 readObject() 메서드가 호출됩니다.

ObjectOutputStream 에서 가장 중요한 메소드 는 다음과 같습니다.

위 코드 라인은 https://www.baeldung.com/java-serialization에서 가져온 것입니다.

위의 코드 줄에서 직렬화 가능한 개체를 가져온 다음 바이트 스트림 또는 스트림으로 변환합니다.

ObjectInputStream의 경우 가장 중요한 방법은 다음과 같습니다.

위 코드 라인은 https://www.baeldung.com/java-serialization에서 가져온 것입니다.

위의 코드 라인은 바이트 시퀀스를 읽고 이 바이트 스트림을 Java의 객체로 변환할 수 있습니다. 이를 통해 원래 개체를 다시 캐스팅할 수 있습니다.

직렬화 프로세스에 대한 설명은 다음과 같습니다.

직렬화를 위해 "Person" 클래스가 고려됩니다. 정적 필드는 직렬화되지 않으며 일부 클래스에 속합니다. 직렬화 과정에서 "transient" 키워드를 사용하여 클래스 필드를 무시할 수 있습니다.

원천

사람 유형의 개체는 일부 로컬 파일에 저장한 다음 값을 다시 읽을 수 있습니다. 아래 표시된 코드를 이러한 용도로 사용할 수 있습니다.

ObjectOutputStream은 FileOutputStream을 사용하여 객체 상태를 파일에 저장하는 데 사용되었습니다. 이 예에서는 프로젝트 디렉토리에 "yourfile.txt"라는 파일이 생성되었습니다. FileInputStream을 사용하여 생성된 파일을 로드합니다. 그런 다음 이 스트림은 ObjectInputStream에 의해 선택되고 이름이 p2인 새 개체로 변환됩니다. 로드된 개체의 상태가 최종적으로 테스트되고 원래 개체의 상태와 일치됩니다. 로드되는 개체는 명시적으로 일반 사람에게 캐스트되어야 합니다.

Java 직렬화의 주의 사항

1. 상속과 구성

사용자가 java.io.Serializable 인터페이스를 구현할 때마다 인터페이스를 구현하는 모든 클래스 하위 클래스가 직렬화 가능하게 됩니다. 또한 객체가 다른 객체에 대한 참조를 보유하는 경우 인터페이스를 구현하는 데 참조되는 객체는 별도로 직렬화할 수 있습니다. 이러한 객체가 인터페이스를 구현하지 않으면 예외가 발생합니다. 던져진 예외는 NotSerializableException입니다. 또한 객체의 배열이 직렬화 가능한 객체에 저장되어 있다고 가정하면 모든 배열 객체를 직렬화해야 합니다. 객체의 직렬화가 발생하지 않으면 "NotSerializableException" 예외가 발생합니다.

2. 시리얼 버전 UID

Serializable 인터페이스를 구현하는 모든 클래스에 대해 숫자는 각 클래스와 연결됩니다. 번호는 JVM(Java Virtual Machine)과 연결됩니다. 이것은 주로 로드 및 저장되는 객체가 정확한 속성을 가지고 있는지 확인하기 위해 수행됩니다. 속성이 동일한 경우에만 직렬화 시 개체가 호환됩니다. IDE는 이러한 숫자를 자동으로 생성하며 주로 클래스 이름, 해당 속성 및 연결된 액세스 수정자를 기반으로 합니다. "InvalidClassException"이라는 예외는 변경 결과로 인해 다른 번호가 발생하는 경우 발생합니다.

serialVersionUID가 직렬화 가능한 클래스에 의해 선언되지 않은 경우 JVM은 런타임 중에 자동으로 생성합니다. 번호가 자동으로 생성되지만 클래스에서 serialVersionUID를 선언하는 것이 좋습니다. 이는 자동으로 생성되는 serialVersionUID가 컴파일러에 종속되고 때때로 예기치 않은 InvalidClassException이 발생할 수 있기 때문입니다.

3. 사용자 정의 직렬화

객체를 직렬화하기 위한 기본 방법이 Java에 설정되었습니다. Java는 이 기본 동작을 재정의할 수 있습니다. 사용자 정의 직렬화를 위한 방법이 있습니다. 직렬화할 수 없는 속성을 가진 객체가 직렬화를 시도하는 경우에 특히 유용합니다. 이러한 객체에 대한 직렬화는 사용자가 직렬화하려는 클래스 내에서 두 가지 방법을 통해 수행할 수 있습니다. 이 두 가지 방법은 다음과 같습니다.

위의 두 가지 방법은 속성을 직렬화할 수 있는 형식으로 직렬화하는 데 사용할 수 있습니다.

자바 직렬화의 장점

Java 직렬화의 장점 중 하나는 객체의 상태가 네트워크에서 이동할 수 있다는 것입니다.

자바 인터페이스 java.io.Serializable

java.io.Serializable은 인터페이스 내에 메소드와 객체가 없음을 의미하는 마커 인터페이스입니다. 마커 인터페이스의 주요 기능은

클래스의 모든 개체에 특정 기능을 제공하는 Java 클래스. 마커 인터페이스의 예는 원격 및 복제 가능입니다.

인터페이스는 해당 개체를 직렬화하기 위해 인터페이스를 사용하는 모든 클래스에서 구현해야 합니다. 기본적으로 래퍼 클래스 및 String 클래스와 같은 클래스는 java.io.Serializable 인터페이스를 구현합니다.

자바 직렬화 가능 예제는 아래와 같습니다.

위의 코드에서 Student 클래스가 Serializable 인터페이스를 구현한 것을 볼 수 있습니다. 따라서 클래스가 Serializable 인터페이스를 구현하면 클래스 내의 객체를 스트림의 바이트로 변환할 수 있습니다.

  • ObjectOutputStream 클래스

이 클래스는 데이터의 기본 유형과 Java 객체를 OutputStream에 쓰는 데 사용됩니다. java.io.Serializable 인터페이스를 지원하는 객체는 스트림에 작성하는 데 사용할 수 있습니다.

  • ObjectInputStream 클래스

ObjectOutputStream을 사용하여 작성된 모든 기본 데이터는 ObjectInputStream을 사용하여 역직렬화됩니다.

Java의 직렬화 가능 인터페이스의 예는 다음과 같습니다.

이 예에서 학생 클래스는 직렬화됩니다. ObjectOutputStream 클래스의 writeObject() 메서드는 객체 직렬화를 위한 모든 기능을 제공합니다. 개체의 상태는 f.txt라는 이름의 파일에 저장됩니다.

결론

이 기사에서는 Java의 직렬화 개념에 대해 설명했습니다. 클래스의 개체를 직렬화하는 데 필요한 인터페이스 및 기타 중요한 메서드를 나열했습니다. 직렬화 프로세스는 항상 직렬화 가능한 모든 클래스의 ID 또는 숫자와 연결됩니다. 이 번호를 SerialVersionUID라고 합니다. SerialVersionUID의 주요 용도는 직렬화할 개체에 대한 보낸 사람과 받는 사람을 확인하는 것입니다. 발신자와 수신자가 동일해야 하기 때문입니다.

프로그래밍 언어인 Java의 중요한 기능입니다. Java의 이러한 중요한 기능과 개념에 대해 더 많이 알고 프로그래밍 언어 기술을 마스터하려면 upGrad에서 제공하는 소프트웨어 엔지니어링 과정 을 확인할 수 있습니다. 당신이 일하는 전문가라면 그 과정이 당신에게 가장 적합합니다. 모든 형태의 질문이 있는 경우 지원 팀에 연락할 수 있습니다. 특정 과정에 대한 웹사이트를 탐색하고 자세한 정보를 얻을 수도 있습니다.

Java에서 직렬화 가능한 인터페이스는 무엇입니까?

직렬화 가능한 인터페이스는 마커 인터페이스입니다. 마커 인터페이스는 구현 클래스가 직렬화되도록 허용하는 Java 런타임에 대한 힌트를 제공합니다. 런타임은 이 인터페이스를 활용하여 개체를 직렬화합니다. Java의 직렬화 가능 인터페이스는 Java의 데이터 클래스에 의해 구현되는 특수 인터페이스입니다. 클래스가 이 인터페이스를 구현하면 데이터베이스에 유지될 수 있습니다. 이 인터페이스는 java.io 패키지에 선언되어 있습니다. 직렬화 가능한 인터페이스에는 데이터베이스의 객체를 읽고 쓰는 데 사용되는 두 가지 메서드인 readResolve() 및 writeReplace()가 있습니다.

Java에서 직렬화 가능 인터페이스를 구현하면 어떻게 됩니까?

Java에서 직렬화 가능 인터페이스를 구현한다는 것은 직렬화 가능 인터페이스가 있는 모든 시스템에서 직렬화 및 역직렬화할 수 있는 객체를 갖는 것을 의미합니다. 이러한 인터페이스의 구현은 클래스가 외부적으로 타사 라이브러리(JSON, XML 등) 또는 네트워크 프로토콜에 의해 직렬화될 때 효과적입니다. 변수가 직렬화 가능으로 선언되면 변수의 각 인스턴스는 매개변수로 메서드에 전달되거나 메서드에서 반환될 때 직렬화 및 역직렬화됩니다. 직렬화는 프로그래밍 방식으로 수행되므로 나중에 역직렬화하여 개체 사용자에게 표시해야 할 때 개체의 상태를 보존할 수 있습니다.

네트워크를 통해 직렬화된 객체를 전송할 수 있습니까?

직렬화된 개체는 바이트 스트림을 포함하는 개체입니다. 객체의 생성자 또는 writeObject() / readObject() 메서드는 바이트 스트림을 객체에 배치하는 데 사용됩니다. 저장된 데이터는 텍스트, 오디오, 비디오 또는 사용자 정의 응용 프로그램 데이터일 수 있습니다. 이러한 개체에 대한 데이터는 파일이나 원격 서버에 저장할 수 있습니다. 네트워크를 통해 직렬화된 객체를 전송하려면 RMI(Remote Method Invocation) 프로토콜을 사용해야 합니다. RMI는 분산 응용 프로그램을 만들기 위한 좋은 프로토콜입니다. 이를 통해 클라이언트는 서버에서 실행되는 Java 응용 프로그램의 개체에 대한 메서드와 통신할 수 있습니다. RMI 프로토콜은 원격 프로시저 호출(RPC) 메커니즘입니다.