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