logo

Java의 직렬화 및 역직렬화

  1. 직렬화
  2. 직렬화 가능 인터페이스
  3. 직렬화의 예
  4. 역직렬화의 예
  5. 상속을 통한 직렬화
  6. 외부화 가능한 인터페이스
  7. 직렬화 및 정적 데이터 멤버

Java의 직렬화 의 메커니즘이다 객체의 상태를 바이트 스트림에 기록 . 주로 Hibernate, RMI, JPA, EJB 및 JMS 기술에 사용됩니다.

직렬화의 역연산을 호출합니다. 역직렬화 여기서 바이트 스트림은 객체로 변환됩니다. 직렬화 및 역직렬화 프로세스는 플랫폼 독립적입니다. 즉, 한 플랫폼에서 개체를 직렬화하고 다른 플랫폼에서 역직렬화할 수 있음을 의미합니다.

객체를 직렬화하기 위해 우리는 쓰기객체() 의 방법 객체출력스트림 클래스이며 역직렬화를 위해 우리는 읽기객체() 의 방법 객체입력스트림 수업.

우리는 다음을 구현해야 합니다. 직렬화 가능 객체 직렬화를 위한 인터페이스

Java 직렬화의 장점

이는 주로 네트워크에서 객체의 상태를 이동하는 데 사용됩니다(마샬링이라고 함).

자바 직렬화

java.io.직렬화 가능 인터페이스

직렬화 가능 마커 인터페이스입니다(데이터 멤버 및 메서드가 없음). 이는 Java 클래스를 '표시'하여 해당 클래스의 객체가 특정 기능을 얻을 수 있도록 하는 데 사용됩니다. 그만큼 복제 가능 그리고 원격 마커 인터페이스이기도 합니다.

그만큼 직렬화 가능 인터페이스는 객체가 지속되어야 하는 클래스에 의해 구현되어야 합니다.

String 클래스와 모든 래퍼 클래스는 다음을 구현합니다. java.io.직렬화 가능 기본적으로 인터페이스.

아래의 예를 살펴보겠습니다.

Student.java

 import java.io.Serializable; public class Student implements Serializable{ int id; String name; public Student(int id, String name) { this.id = id; this.name = name; } } 

위의 예에서, 학생 클래스는 직렬화 가능 인터페이스를 구현합니다. 이제 해당 객체를 스트림으로 변환할 수 있습니다. 의 메인 클래스 구현은 다음 코드에 나와 있습니다.

ObjectOutputStream 클래스

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

건설자

1) public ObjectOutputStream(OutputStream out)이 IOException을 발생시킵니다. {}지정된 OutputStream에 쓰는 ObjectOutputStream을 생성합니다.

중요한 방법

방법설명
1) public final void writeObject(Object obj)가 IOException을 발생시킵니다. {}지정된 개체를 ObjectOutputStream에 씁니다.
2) 공개 무효 플러시()가 IOException {}을 발생시킵니다.현재 출력 스트림을 플러시합니다.
3) public void close()가 IOException {}을 발생시킵니다.현재 출력 스트림을 닫습니다.

ObjectInputStream 클래스

ObjectInputStream은 ObjectOutputStream을 사용하여 작성된 객체와 기본 데이터를 역직렬화합니다.

건설자

char을 문자열로 변환 java
1) public ObjectInputStream(InputStream in)이 IOException을 발생시킵니다. {}지정된 InputStream에서 읽는 ObjectInputStream을 생성합니다.

중요한 방법

방법설명
1) 공개 최종 객체 readObject()가 IOException, ClassNotFoundException{}을 발생시킵니다.입력 스트림에서 객체를 읽습니다.
2) public void close()가 IOException {}을 발생시킵니다.ObjectInputStream을 닫습니다.

Java 직렬화의 예

이 예에서는 객체를 직렬화하겠습니다. 학생 위 코드의 클래스. ObjectOutputStream 클래스의 writeObject() 메서드는 객체를 직렬화하는 기능을 제공합니다. f.txt라는 파일에 개체의 상태를 저장하고 있습니다.

Persist.java

 import java.io.*; class Persist{ public static void main(String args[]){ try{ //Creating the object Student s1 =new Student(211,'ravi'); //Creating stream and writing the object FileOutputStream fout=new FileOutputStream('f.txt'); ObjectOutputStream out=new ObjectOutputStream(fout); out.writeObject(s1); out.flush(); //closing the stream out.close(); System.out.println('success'); }catch(Exception e){System.out.println(e);} } } 

산출:

 success 
이 직렬화 예제를 다운로드하세요

Java 역직렬화의 예

역직렬화는 직렬화된 상태에서 개체를 재구성하는 프로세스입니다. 직렬화의 반대 작업입니다. 역직렬화된 개체에서 데이터를 읽는 예를 살펴보겠습니다.

역직렬화는 직렬화된 상태에서 개체를 재구성하는 프로세스입니다. 직렬화의 반대 작업입니다. 역직렬화된 개체에서 데이터를 읽는 예를 살펴보겠습니다.

Depersist.java

 import java.io.*; class Depersist{ public static void main(String args[]){ try{ //Creating stream to read the object ObjectInputStream in=new ObjectInputStream(new FileInputStream('f.txt')); Student s=(Student)in.readObject(); //printing the data of the serialized object System.out.println(s.id+' '+s.name); //closing the stream in.close(); }catch(Exception e){System.out.println(e);} } } 

산출:

211 ravi 
이 역직렬화 예제를 다운로드하세요.

상속을 통한 Java 직렬화(IS-A 관계)

클래스가 구현하는 경우 직렬화 가능한 인터페이스 그러면 모든 하위 클래스도 직렬화 가능합니다. 아래의 예를 살펴보겠습니다.

SerializeISA.java

 import java.io.Serializable; class Person implements Serializable{ int id; String name; Person(int id, String name) { this.id = id; this.name = name; } } class Student extends Person{ String course; int fee; public Student(int id, String name, String course, int fee) { super(id,name); this.course=course; this.fee=fee; } } public class SerializeISA { public static void main(String args[]) { try{ //Creating the object Student s1 =new Student(211,'ravi','Engineering',50000); //Creating stream and writing the object FileOutputStream fout=new FileOutputStream('f.txt'); ObjectOutputStream out=new ObjectOutputStream(fout); out.writeObject(s1); out.flush(); //closing the stream out.close(); System.out.println('success'); }catch(Exception e){System.out.println(e);} try{ //Creating stream to read the object ObjectInputStream in=new ObjectInputStream(new FileInputStream('f.txt')); Student s=(Student)in.readObject(); //printing the data of the serialized object System.out.println(s.id+' '+s.name+' '+s.course+' '+s.fee); //closing the stream in.close(); }catch(Exception e){System.out.println(e);} } } 

산출:

 success 211 ravi Engineering 50000 

SerializeISA 클래스는 직렬화 가능한 Person 클래스를 확장하는 Student 클래스 개체를 직렬화했습니다. 상위 클래스 속성은 하위 클래스에 상속되므로 상위 클래스가 직렬화 가능하면 하위 클래스도 직렬화 가능합니다.

집계를 통한 Java 직렬화(HAS-A 관계)

클래스에 다른 클래스에 대한 참조가 있는 경우 모든 참조는 직렬화 가능해야 합니다. 그렇지 않으면 직렬화 프로세스가 수행되지 않습니다. 그러한 경우, NotSerializeException 런타임에 발생합니다.

Address.java

 class Address{ String addressLine,city,state; public Address(String addressLine, String city, String state) { this.addressLine=addressLine; this.city=city; this.state=state; } } 

Student.java

 import java.io.Serializable; public class Student implements Serializable{ int id; String name; Address address;//HAS-A public Student(int id, String name) { this.id = id; this.name = name; } } 

Address는 직렬화 가능하지 않으므로 Student 클래스의 인스턴스를 직렬화할 수 없습니다.

참고: 객체 내의 모든 객체는 직렬화 가능해야 합니다.

정적 데이터 멤버를 사용한 Java 직렬화

클래스에 정적 데이터 멤버가 있는 경우 정적은 개체가 아닌 클래스의 일부이므로 직렬화되지 않습니다.

Employee.java

 class Employee implements Serializable{ int id; String name; static String company='SSS IT Pvt Ltd';//it won't be serialized public Student(int id, String name) { this.id = id; this.name = name; } } 

배열 또는 컬렉션을 사용한 Java 직렬화

규칙: 배열 또는 컬렉션의 경우 배열 또는 컬렉션의 모든 개체는 직렬화 가능해야 합니다. 직렬화할 수 없는 개체가 있으면 직렬화가 실패합니다.

Java에서 외부화 가능

외부화 가능 인터페이스는 객체의 상태를 압축 형식으로 바이트 스트림에 기록하는 기능을 제공합니다. 마커 인터페이스가 아닙니다.

외부화 가능 인터페이스는 두 가지 방법을 제공합니다.

    public void writeExternal(ObjectOutput out)이 IOException을 발생시킵니다. public void readExternal(ObjectInput in)이 IOException을 발생시킵니다.

Java 임시 키워드

클래스의 데이터 멤버를 직렬화하지 않으려면 일시적으로 표시하면 됩니다.

Employee.java

 class Employee implements Serializable{ transient int id; String name; public Student(int id, String name) { this.id = id; this.name = name; } } 

이제 id는 직렬화되지 않으므로 직렬화 후 객체를 deserialize하면 id 값을 얻을 수 없습니다. 항상 기본값을 반환합니다. 이 경우 id의 데이터 유형이 정수이므로 0을 반환합니다.

자세한 내용을 보려면 다음 페이지를 방문하세요.

SerialVersionUID

런타임 시 직렬화 프로세스는 ID를 SerialVersionUID라고 하는 각 직렬화 가능 클래스와 연결합니다. 직렬화된 객체의 송신자와 수신자를 확인하는 데 사용됩니다. 보내는 사람과 받는 사람이 동일해야 합니다. 이를 확인하기 위해 SerialVersionUID가 사용됩니다. 발신자와 수신자는 동일한 SerialVersionUID를 가져야 합니다. 그렇지 않으면 잘못된클래스예외 개체를 역직렬화하면 throw됩니다. Serialize 클래스에서 자체 SerialVersionUID를 선언할 수도 있습니다. 이렇게 하려면 SerialVersionUID 필드를 만들고 여기에 값을 할당해야 합니다. static 및 final이 포함된 긴 유형이어야 합니다. 클래스에서 serialVersionUID 필드를 명시적으로 선언하고 비공개로 설정하는 것이 좋습니다. 예를 들어:

 private static final long serialVersionUID=1L; 

이제 직렬화 가능 클래스는 다음과 같습니다.

Employee.java

array.from 자바
 import java.io.Serializable; class Employee implements Serializable{ private static final long serialVersionUID=1L; int id; String name; public Student(int id, String name) { this.id = id; this.name = name; } }