자바 직렬화
자바의 바이트 순서가 개체의 데이터 유형을 포함하는, 객체가 바이트 시퀀스로서 표현 될 수있는 객체 직렬화 메커니즘을 제공하며, 객체 및 데이터의 타입에 관한 정보가 객체에 포함 .
파일 직렬화 된 오브젝트에 기록 된 후 파일로부터 판독 될 수 있고,이를 역 직렬화, 즉, 오브젝트 정보 데이터 객체 및 객체 데이터 타입의 타입 메모리에 사용될 수있다 새로운 객체.
전체 프로세스는 완전히 다른 플랫폼 객체를 직렬화 할 수있는 플랫폼 객체 직렬화, 즉, 자바 가상 머신 (JVM)에 독립적이다.
ObjectInputStream를하고 ObjectOutputStream에 클래스 높은 수준의 데이터 스트림, 직렬화 및 방법은 안티 시퀀스 개체가 포함되어 있습니다.
ObjectOutputStream의 클래스는 다양한 데이터 유형을 기록 할 많은 기록 방법이지만 특별한 방법 예외를 포함
public final void writeObject(Object x) throws IOException
위의 방법은 객체를 직렬화 및 출력 스트림에 보냅니다. 유사는 ObjectInputStream 클래스는 다음과 같은 객체의 메소드를 역 직렬화 포함
public final Object readObject() throws IOException, ClassNotFoundException
이 방법은, 스트림으로부터 다음의 오브젝트를, 상기 객체는 탈 직렬화된다. 반환 값은 객체이므로 적절한 데이터 형식으로 변환해야합니다.
자바 직렬화가 어떻게 작동하는지입니다 설명하기 위해, 나는 우리가 Serializable 인터페이스를 구현하는 다음과 같은 Employee 클래스를 정의하는 경우, 앞서 언급 한 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.io.Serializable 인터페이스를 달성하지 않았습니다 볼 필요가있다.
직렬화 된 객체
ObjectOutputStream의 클래스는 객체를 직렬화하는 데 사용됩니다, 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의 직렬화는, / tmp를 / employee.ser은 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
여기에서 우리는 다음과 같은 사항을주의해야합니다
ClassNotFoundException가 예외를 잡기 위해 try / catch 블록 시도에서의 readObject () 메소드. JVM이 객체를 직렬화 할 들어, 바이트 코드 클래스를 찾을 수 있어야한다. JVM이 역 직렬화 프로세스 객체의 클래스를 찾을 수없는 경우, ClassNotFoundException가 예외를 throw합니다.
반환 값은, readObject에 () 메서드가 직원 참조로 변환합니다.
객체 직렬화되면 재산권 짧기 때문에, 속성 SSN 값 111 222 333이지만,이 값은 출력 스트림으로 전송되지 않는다. 그래서 SSN은 직렬화 된 Employee 객체가 0 때문이다.