Java java지도 시간 Java의 직렬화 및 역직렬화

Java의 직렬화 및 역직렬화

Oct 31, 2024 am 06:12 AM

Serialization and Deserialization In Java

고급 Java에서 직렬화 및 역직렬화는 객체의 상태를 저장 및 복원하여 객체를 파일이나 데이터베이스에 저장하거나 네트워크를 통해 전송할 수 있게 하는 프로세스입니다. 다음은 이러한 개념과 적용에 대한 분석입니다

1️⃣ 연재

직렬화는 객체를 바이트 스트림으로 변환하는 프로세스입니다. 이 바이트 스트림은 파일에 저장되거나, 네트워크를 통해 전송되거나, 데이터베이스에 저장될 수 있습니다. Java에서는 직렬화 가능 인터페이스를 사용하여 클래스를 직렬화할 수 있음을 나타냅니다.

✍ 객체 직렬화 단계:

▶️ 직렬화 가능 인터페이스를 구현합니다.

▶️ ObjectOutputStream 및 FileOutputStream을 사용하여 객체를 파일 또는 출력 스트림에 씁니다.

▶️ ObjectOutputStream에서 writeObject() 메서드를 호출하세요.

?코드 예:

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

class Employee implements Serializable {
    private static final long serialVersionUID = 1L;
    String name;
    int id;

    public Employee(String name, int id) {
        this.name = name;
        this.id = id;
    }
}

public class SerializeDemo {
    public static void main(String[] args) {
        Employee emp = new Employee("John Doe", 101);

        try (FileOutputStream fileOut = new FileOutputStream("employee.ser");
             ObjectOutputStream out = new ObjectOutputStream(fileOut)) {
            out.writeObject(emp);
            System.out.println("Serialized data is saved in employee.ser");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

로그인 후 복사

여기에서 Employee.ser는 객체의 바이트 스트림을 저장하는 직렬화된 파일입니다.

2️⃣ 역직렬화
역직렬화는 바이트 스트림이 원래 개체의 복사본으로 다시 변환되는 반대 프로세스입니다. 이를 통해 객체를 저장하거나 전송한 후 객체의 상태를 다시 생성할 수 있습니다.

✍ 객체 역직렬화 단계:

▶️ 파일 또는 입력 스트림에서 객체를 읽으려면 ObjectInputStream 및 FileInputStream을 사용하세요.

▶️ ObjectInputStrea에서 readObject() 메서드 호출

?코드 예:

import java.io.FileInputStream;
import java.io.ObjectInputStream;

public class DeserializeDemo {
    public static void main(String[] args) {
        Employee emp = null;

        try (FileInputStream fileIn = new FileInputStream("employee.ser");
             ObjectInputStream in = new ObjectInputStream(fileIn)) {
            emp = (Employee) in.readObject();
            System.out.println("Deserialized Employee...");
            System.out.println("Name: " + emp.name);
            System.out.println("ID: " + emp.id);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

로그인 후 복사

이렇게 하면 개체의 원래 상태가 검색되어 직렬화 전의 필드에 액세스할 수 있습니다.

3️⃣ 고급 연재 주제

▶️ 사용자 정의 직렬화: 사용자 정의 직렬화를 위해 writeObject() 및 readObject()를 재정의합니다.

▶️ 외부화 가능 인터페이스: 직렬화에 대한 완전한 제어를 제공하며 writeExternal() 및 readExternal() 메소드 구현이 필요합니다.

▶️ 임시 필드: 특정 필드(예: 비밀번호와 같은 민감한 데이터)를 직렬화하지 않으려면 임시 키워드를 사용하세요.

✍ 직렬화의 장점:

▶️ 나중에 사용할 수 있도록 객체의 상태를 저장할 수 있습니다.

▶️ 네트워크를 통한 복잡한 데이터 객체의 전송을 촉진합니다.

? 코드 예를 간단히 설명

import java.io.*;

class Student implements Serializable {
    private  static   final long serialVersionUId = 1l;
    private String name ;
    private int  age;
    private String Address;

    public Student(String name,int age,String Address){
        this.name = name;
        this.age = age;
        this.Address = Address;
    }
    public void setName(String name){
        this.name = name;
    }
    public void setAge(int age){
        this.age = age;
    }
    public void setAddress(String Address){
        this.Address = Address;
    }

    public String getName(){
        return name;
    }
    public String getAddress(){
        return Address;
    }
    public int getAge(){
        return age;
    }


    public String toString(){
        return ("Student name is "+this.getName()+", age is "+this.getAge()+", and address is "+this.getAddress());
    }
}

public class  JAVA3_Serialization {
    // when you implement Serializable then you must be write a serialVersionUId because when it serialise and deserialize it uniquely identify in the network
    // when u update ur object or anything then you have to update the serialVersionUId increment .
    // private  static   final long serialVersionUId = 1l;

    // transient  int x ;
    // If you do not want a particular value to serialise and Deserialize.
    // the value x, when you don't serialise and Deserialize Then transient you used.

    public static void main(String[] args) {

        Student student = new Student("kanha",21,"angul odisha");

        String filename = "D:\Advance JAVA\CLS3 JAVA\Test.txt"; // store the data in this location
        FileOutputStream fileOut = null; // write file
        ObjectOutputStream objOut = null; // create object
        //Serialization
        try {
            fileOut = new FileOutputStream(filename);
            objOut = new ObjectOutputStream(fileOut);
            objOut.writeObject(student);

            objOut.close();
            fileOut.close();

            System.out.println("Object has been serialise =\n"+student);
        } catch (IOException ex){
            System.out.println("error will occure");
        }

        //Deserialization
        FileInputStream fileIn = null;
        ObjectInputStream objIn = null;
        try {
            fileIn = new FileInputStream(filename);
            objIn = new ObjectInputStream(fileIn);
            Student object =(Student) objIn.readObject();
            System.out.println("object has been Deserialization =\n"+object);

            objIn.close();
            fileIn.close();

        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }
}

로그인 후 복사

✍ 주요 참고사항:

▶️ 기본적으로 비정적 및 비일시적 데이터 멤버만 직렬화됩니다.

▶️ 직렬화 가능 객체는 직렬화 후 클래스가 수정되는 경우 버전 간 호환성을 보장해야 합니다.

더 많은 통찰력을 얻으려면 GitHub에서 심층적인 예제와 코드 샘플을 언급해 주세요! 구체적인 조정이 필요한 경우 알려주세요.

GitHub - https://github.com/Prabhanjan-17p

위 내용은 Java의 직렬화 및 역직렬화의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

뜨거운 기사 태그

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Java의 클래스로드 메커니즘은 다른 클래스 로더 및 대표 모델을 포함하여 어떻게 작동합니까? Java의 클래스로드 메커니즘은 다른 클래스 로더 및 대표 모델을 포함하여 어떻게 작동합니까? Mar 17, 2025 pm 05:35 PM

Java의 클래스로드 메커니즘은 다른 클래스 로더 및 대표 모델을 포함하여 어떻게 작동합니까?

2025 년 상위 4 개의 JavaScript 프레임 워크 : React, Angular, Vue, Svelte 2025 년 상위 4 개의 JavaScript 프레임 워크 : React, Angular, Vue, Svelte Mar 07, 2025 pm 06:09 PM

2025 년 상위 4 개의 JavaScript 프레임 워크 : React, Angular, Vue, Svelte

고급 Java 프로젝트 관리, 구축 자동화 및 종속성 해상도에 Maven 또는 Gradle을 어떻게 사용합니까? 고급 Java 프로젝트 관리, 구축 자동화 및 종속성 해상도에 Maven 또는 Gradle을 어떻게 사용합니까? Mar 17, 2025 pm 05:46 PM

고급 Java 프로젝트 관리, 구축 자동화 및 종속성 해상도에 Maven 또는 Gradle을 어떻게 사용합니까?

Java에서 기능 프로그래밍 기술을 어떻게 구현할 수 있습니까? Java에서 기능 프로그래밍 기술을 어떻게 구현할 수 있습니까? Mar 11, 2025 pm 05:51 PM

Java에서 기능 프로그래밍 기술을 어떻게 구현할 수 있습니까?

Node.js 20 : 주요 성능 향상 및 새로운 기능 Node.js 20 : 주요 성능 향상 및 새로운 기능 Mar 07, 2025 pm 06:12 PM

Node.js 20 : 주요 성능 향상 및 새로운 기능

빙산 : 데이터 호수 테이블의 미래 빙산 : 데이터 호수 테이블의 미래 Mar 07, 2025 pm 06:31 PM

빙산 : 데이터 호수 테이블의 미래

캐싱 및 게으른 하중과 같은 고급 기능을 사용하여 객체 관계 매핑에 JPA (Java Persistence API)를 어떻게 사용하려면 어떻게해야합니까? 캐싱 및 게으른 하중과 같은 고급 기능을 사용하여 객체 관계 매핑에 JPA (Java Persistence API)를 어떻게 사용하려면 어떻게해야합니까? Mar 17, 2025 pm 05:43 PM

캐싱 및 게으른 하중과 같은 고급 기능을 사용하여 객체 관계 매핑에 JPA (Java Persistence API)를 어떻게 사용하려면 어떻게해야합니까?

카페인 또는 구아바 캐시와 같은 라이브러리를 사용하여 자바 애플리케이션에서 다단계 캐싱을 구현하려면 어떻게해야합니까? 카페인 또는 구아바 캐시와 같은 라이브러리를 사용하여 자바 애플리케이션에서 다단계 캐싱을 구현하려면 어떻게해야합니까? Mar 17, 2025 pm 05:44 PM

카페인 또는 구아바 캐시와 같은 라이브러리를 사용하여 자바 애플리케이션에서 다단계 캐싱을 구현하려면 어떻게해야합니까?

See all articles