> Java > java지도 시간 > 본문

Java의 직렬화 및 역직렬화

DDD
풀어 주다: 2024-10-31 06:12:30
원래의
913명이 탐색했습니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿