Latest web development tutorials

자바 직렬화

자바의 바이트 순서가 개체의 데이터 유형을 포함하는, 객체가 바이트 시퀀스로서 표현 될 수있는 객체 직렬화 메커니즘을 제공하며, 객체 및 데이터의 타입에 관한 정보가 객체에 포함 .

파일 직렬화 된 오브젝트에 기록 된 후 파일로부터 판독 될 수 있고,이를 역 직렬화, 즉, 오브젝트 정보 데이터 객체 및 객체 데이터 타입의 타입 메모리에 사용될 수있다 새로운 객체.

전체 프로세스는 완전히 다른 플랫폼 객체를 직렬화 할 수있는 플랫폼 객체 직렬화, 즉, 자바 가상 머신 (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 때문이다.