java
Java는 객체 직렬화라고 하는 메커니즘을 제공합니다. 여기서 객체는 객체의 데이터와 객체의 유형 및 객체에 저장된 데이터 유형에 대한 정보를 포함하는 바이트 시퀀스로 표현될 수 있습니다.
직렬화된 개체가 파일에 작성된 후에는 파일에서 읽고 역직렬화할 수 있습니다. 즉, 개체와 해당 데이터를 나타내는 유형 정보와 바이트를 사용하여 메모리에 개체를 다시 만들 수 있습니다.
가장 인상적인 것은 전체 프로세스가 JVM에 독립적이라는 점입니다. 즉, 한 플랫폼에서 개체를 직렬화하고 완전히 다른 플랫폼에서 역직렬화할 수 있습니다.
ObjectInputStream 클래스 및 ObjectOutputStream 개체를 직렬화 및 역직렬화하는 방법을 포함하는 상위 수준 스트림입니다.
ObjectOutputStream 클래스에는 다양한 데이터 유형을 작성하기 위한 많은 쓰기 메서드가 포함되어 있지만 특히 한 가지 방법이 눈에 띕니다.
public final void writeObject(Object x) throws IOException
위의 메서드는 Object를 직렬화하여 출력 스트림으로 보냅니다. 유사하게, ObjectInputStream 클래스는 객체를 역직렬화하기 위한 다음 메소드를 포함합니다 -
public final Object readObject() throws IOException, ClassNotFoundException
이 메서드는 스트림에서 다음 Object를 검색하고 역직렬화합니다. 반환 값은 Object이므로 적절한 데이터 유형으로 변환해야 합니다.
Java에서 직렬화가 어떻게 작동하는지 보여주기 위해 이 책의 초반부에 논의한 Employee 클래스를 사용할 것입니다. Serializable 인터페이스를 구현하는 다음 Employee 클래스가 있다고 가정합니다. -
public class Employee implements java.io.Serializable { public String name; public String address; public transient int SSN; public int number; public void mailCheck() { System.out.println("Mailing a check to " + name + " " + address); } }
클래스가 성공적으로 직렬화되려면 두 가지 조건이 충족되어야 합니다.
클래스는 java.io.Serializable 인터페이스를 구현해야 합니다.
클래스의 모든 필드는 직렬화 가능해야 합니다. 필드를 직렬화할 수 없는 경우 일시적으로 표시해야 합니다. .
Java 표준 클래스가 직렬화 가능한지 여부가 궁금한 경우 해당 클래스에 대한 설명서를 확인하십시오. 테스트는 간단합니다. 클래스가 java.io.Serializable을 구현하면 직렬화 가능합니다. 그렇지 않으면 그렇지 않습니다.
ObjectOutputStream 클래스는 Object를 직렬화하는 데 사용됩니다. 다음 SerializeDemo 프로그램은 Employee 개체를 인스턴스화하고 파일로 직렬화합니다.
프로그램 실행이 완료되면 employee.ser라는 파일이 생성됩니다. 프로그램은 출력을 생성하지 않지만 코드를 연구하고 프로그램이 수행하는 작업을 확인합니다.
참고 − 객체를 파일로 직렬화할 때 Java의 표준 규칙은 파일에 .ser를 제공하는 것입니다. 확장자.
import java.io.*; public class SerializeDemo { public static void main(String [] args) { Employee e = new Employee(); e.name = "Reyan Ali"; e.address = "Phokka Kuan, Ambehta Peer"; e.SSN = 11122333; e.number = 101; try { FileOutputStream fileOut = new FileOutputStream("/tmp/employee.ser"); ObjectOutputStream out = new ObjectOutputStream(fileOut); out.writeObject(e); out.close(); fileOut.close(); System.out.printf("Serialized data is saved in /tmp/employee.ser"); } catch (IOException i) { i.printStackTrace(); } } }
다음 DeserializeDemo 프로그램은 SerializeDemo 프로그램에서 생성된 Employee 개체를 역직렬화합니다. 프로그램을 연구하고 그 결과를 결정하십시오 -
import java.io.*; public class DeserializeDemo { public static void main(String [] args) { Employee e = null; try { FileInputStream fileIn = new FileInputStream("/tmp/employee.ser"); ObjectInputStream in = new ObjectInputStream(fileIn); e = (Employee) in.readObject(); in.close(); fileIn.close(); } catch (IOException i) { i.printStackTrace(); return; } catch (ClassNotFoundException c) { System.out.println("Employee class not found"); c.printStackTrace(); return; } System.out.println("Deserialized Employee..."); System.out.println("Name: " + e.name); System.out.println("Address: " + e.address); System.out.println("SSN: " + e.SSN); System.out.println("Number: " + e.number); } }
이것은 다음 결과를 생성합니다 -
Deserialized Employee... Name: Reyan Ali Address:Phokka Kuan, Ambehta Peer SSN: 0 Number:101
다음은 주목해야 할 중요한 사항입니다 -
try/catch 블록은 readObject() 메서드에 의해 선언된 ClassNotFoundException을 catch하려고 시도합니다. JVM이 객체를 역직렬화할 수 있으려면 클래스의 바이트코드를 찾을 수 있어야 합니다. JVM이 객체를 역직렬화하는 동안 클래스를 찾을 수 없으면 ClassNotFoundException이 발생합니다.
readObject()의 반환 값은 Employee 참조로 캐스팅됩니다.
개체가 직렬화될 때 SSN 필드의 값은 11122333이었지만 필드가 일시적이므로 이 값이 출력 스트림으로 전송되지 않았습니다. 역직렬화된 Employee 개체의 SSN 필드는 0입니다.
java
자바 작성기 클래스 이 자습서에서는 예제를 통해 Java Writer, 해당 하위 클래스 및 메서드에 대해 알아봅니다. Writer java.io 클래스 패키지는 문자 스트림을 나타내는 추상 슈퍼클래스입니다. Writer 이후 추상 클래스이므로 그 자체로는 유용하지 않습니다. 그러나 하위 클래스를 사용하여 데이터를 쓸 수 있습니다. 작가의 하위 클래스 Writer의 기능을 사용하려면 , 우리는 그 하위 클래스를 사용할 수 있습니다. 그 중 일부는 다음과 같습니다. BufferedWriter OutputStreamWriter
자바 InputStreamReader 클래스 이 자습서에서는 예제를 통해 Java InputStreamReader 및 해당 메서드에 대해 알아봅니다. InputStreamReader java.io 클래스 패키지를 사용하여 바이트 데이터를 문자 데이터로 변환할 수 있습니다. 추상 클래스 Reader을 확장합니다. . InputStreamReader 클래스는 다른 입력 스트림과 함께 작동합니다. 바이트 스트림과 문자 스트림 간의 브리지라고도 합니다. InputStreamReader 때문입니다. 입력 스트림에서 바이트를 문자로