소개
직렬화를 변환하는 개체의 상태로 바이트 스트림;직렬화는 그 반대입니다. 다르게 명시 serialization 변환 Java 객체로 정적 스트림(sequence)의 바이트는 다음에 저장되는 데이터베이스 또는 전송 네트워크를 통해.
직렬화 및 직렬화 해제
직렬화 프로세스는 인스턴스와 독립적입니다., 객체는 한 플랫폼에서 직렬화되고 다른 플랫폼에서 직렬화 해제 될 수 있습니다. 직렬화 자격이있는 클래스는 직렬화 가능한 특수 마커 인터페이스를 구현해야합니다.
ObjectInputStream 과 ObjectOutputStream 은 모두 java.io.InputStream 과 java.io.OutputStream 을 각각 확장하는 상위 레벨 클래스입니다. ObjectOutputStream 은 객체의 기본 유형 및 그래프를 출력 스트림에 바이트 스트림으로 쓸 수 있습니다. 이러한 스트림은 이후에 ObjectInputStream 을 사용하여 읽을 수 있습니다.,
가장 중요한 방법에 ObjectOutputStream
public final void writeObject(Object o) throws IOException;
는 직렬화 가능한 객체로 변환 시퀀스(stream)의 바이트입니다. 마찬가지로,가장 중요한 방법에 ObjectInputStream
public final Object readObject() throws IOException, ClassNotFoundException;
경로를 추가 할 수 있습니다.바이트 스트림으로 다시 변환하 Java 개체입니다. 그런 다음 원래 객체로 다시 캐스팅 할 수 있습니다.
Person 클래스로 직렬화를 설명하겠습니다. 정적 필드는 클래스에 속하며(객체와 반대)직렬화되지 않습니다., 또한,주는 우리가 사용할 수 있는 키워드는 일시적인을 무시하는 등 필드를 직렬화하는 동안.
public class Person implements Serializable { private static final long serialVersionUID = 1L; static String country = "ITALY"; private int age; private String name; transient int height; // getters and setters}
이 테스트는 아래의 예를 보여줍을 저장하는 개체의 유형은 사람은 로컬 파일에 다음을 읽는 이 값을 다시:
우리는 우리 사용되는 ObjectOutputStream 저장 상태의 이 객체를 사용하여 파일 FileOutputStream. 파일”yourfile.txt”는 프로젝트 디렉토리에 생성됩니다. 그런 다음이 파일은 FileInputStream 을 사용하여로드됩니다. ObjectInputStream 은이 스트림을 픽업하여 p2 라는 새로운 객체로 변환합니다.,
마지막으로,우리는로드 된 객체의 상태를 테스트하고 원래 객체의 상태와 일치합니다.
로드 된 객체를 명시 적으로 사람 유형으로 캐스팅해야한다는 것을 알 수 있습니다.
Java 직렬화주의 사항
Java 에서 직렬화와 관련된 몇 가지주의 사항이 있습니다.
3.1. 상속과 구성
경우 클래스를 구현하 java.io.Serializable 인터페이스,모든 서브 클래스는 직렬화뿐만 아니라., 반대로,때는 객체에 대한 참조가 있을 다른 개체로,이러한 객체를 구현해야 합니다 Serializable 인터페이스는 별도로,또는 다른 NotSerializableException 것가 발생합니다:
public class Person implements Serializable { private int age; private String name; private Address country; // must be serializable too}
경우 하나의 필드에서 직렬화 개체로 구성되어 있는 객체의 배열을,그 다음 이러한 모든 객체를 직렬화해야 합 뿐만 아니라,또는 다른 NotSerializableException 가 발생합니다.
3.2. 직렬 버전 UID
JVM 은 각 직렬화 가능한 클래스와 버전(긴)번호를 연결합니다., 저장 및로드 된 객체가 동일한 특성을 가지므로 직렬화시 호환되는지 확인하는 데 사용됩니다.
이 번호는 대부분의 Ide 에서 자동으로 생성 될 수 있으며 클래스 이름,속성 및 관련 액세스 수정자를 기반으로합니다. 모든 변경으로 인해 다른 숫자가 발생하고 InvalidClassException 이 발생할 수 있습니다.
serializable 클래스가 serialVersionUID 를 선언하지 않으면 jvm 은 런타임에 자동으로 하나를 생성합니다., 그러나,그것은 매우 추천하는 각 클래스를 선언하의 serialVersionUID 로 생성된 중 하나는 컴파일러에 의존하고 따라서 발생할 수 있습에서 예상치 못한 InvalidClassExceptions.
3.3. Java 에서 사용자 정의 직렬화
Java 는 객체를 직렬화 할 수있는 기본 방법을 지정합니다. Java 클래스는이 기본 동작을 재정의 할 수 있습니다. 사용자 지정 직렬화는 일부 직렬화되지 않은 특성을 가진 객체를 직렬화하려고 할 때 특히 유용 할 수 있습니다., 여 이 작업을 수행할 수 있습 제공하는 두 가지 방법이 내부에는 클래스 우리가 원하는 직렬화:
private void writeObject(ObjectOutputStream out) throws IOException;
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException;
이러한 방법으로,우리는 직렬화를 사 unserializable 특성으로 다른 형태의 직렬화할 수 있습니다:
public class Address { private int houseNumber; // setters and getters}
다음과 같은 단위의 테스트는 이용자 지정 직렬화:
이 코드에서는,우리는 저장하는 방법을 참조하십시오 일부 unserializable 특성으로 직렬화 주소와 사용자 지정 serialization. Notserializableexception 을 피하기 위해 unserializable 속성을 일시적인 것으로 표시해야합니다.,
결론
이 빠른 튜토리얼에서,우리는 검토 Java serialization,논의 중요한 일을 염두에 두고 작업을 수행하는 방법을 보여 사용자 지정 serialization.피>