"오늘 우리가 객체를 파일에 저장하고 파일에서 읽는 것을 조사한 것을 기억할 것입니까?"

"예, 방금 입력 스트림에서 읽은 출력 스트림에 저장했습니다."

"잘 했어, 아미고. 이런 세부 사항을 알아차리다니 기쁘군. 파일에 저장하고 파일에서 읽을 수 있도록 코드를 완성할 수 있니?"

"무엇을 완료하시겠습니까? FileInputStream 및 FileOutputStream을 선언하고 저장 및 로드 메서드에 전달합니다. 여기에 대해 혼동할 것이 없습니다. 매우 간단합니다."

"반가워요. 이제 새로운 주제인 직렬화를 시작하겠습니다 ."

직렬화는 우리가 방금 수행한 것과 거의 동일하지만 훨씬 더 시원하고 Java 시스템에 바로 내장되어 있습니다. Java 머신은 객체를 저장하고 로드할 수 있습니다. 이를 수행하기 위해 저장 및 로드 방법도 필요하지 않습니다. 모든 개체는 Java 시스템 내부에 저장되며 전체 액세스 권한이 있습니다."

객체를 가져와서 스트림에 저장하고 스트림에서 읽습니다.

암호
public static void main(String[] args) throws Exception
{
 Cat cat = new Cat();

 //Save a cat to file
 FileOutputStream fileOutput = new FileOutputStream("cat.dat");
 ObjectOutputStream outputStream = new ObjectOutputStream(fileOutput);
 outputStream.writeObject(cat);
 fileOutput.close();
 outputStream.close();

 //Load a cat from file
 FileInputStream fiStream = new FileInputStream("cat.dat");
 ObjectInputStream objectStream = new ObjectInputStream(fiStream);
 Object object = objectStream.readObject();
 fiStream.close();
 objectStream.close();

 Cat newCat = (Cat)object;
}

"그게 다야?"

"정확합니다. 스트림에 저장하고 거의 모든 데이터 유형의 스트림에서 읽을 수 있는 매우 크고 복잡한 직렬화 메커니즘이 있습니다 ."

"거의 다. 그럼 데이터 유형은 없나요?"

"예, 모든 개체가 고유한 저장 기능을 가지고 있는 것은 아닙니다. 일부 개체는 모든 데이터를 내부에 저장하지 않습니다. 대신 다른 개체 및/또는 데이터 소스를 참조할 뿐입니다. 예를 들어 콘솔(System. in), 입력 스트림(InputStream) 등이 있습니다."

이것이 바로 Java 제작자가 특별한 Serializable 인터페이스 마커를 고안한 이유입니다 . 데이터와 메서드가 포함되어 있지 않기 때문에 marker 라고 합니다 . 클래스를 "태그" 또는 "표시"하는 데만 사용됩니다. 클래스가 모든 데이터를 내부에 저장한다고 믿는다면 이를 implements Serializable 로 표시할 수 있습니다 .

다음은 직렬화를 지원하는 «cat» 예제입니다.

암호
class Cat implements Serializable
{
 public String name;
 public int age;
 public int weight;
}

객체를 직렬화(저장)하려고 할 때 Java 시스템은 직렬화 지원 여부를 확인합니다. Serializable 인터페이스를 구현합니까? 그렇다면 개체를 저장합니다. 그렇지 않은 경우 직렬화가 불가능함을 나타내는 예외가 발생합니다.
여기서 직렬화 가능 객체는 직렬화 가능 객체로만 구성되어야 한다는 것을 이해해야 합니다.

"글쎄, 말이 되는구나. 부분을 저장하지 않고는 전체를 저장할 수 없다."

"정확히."

"그리고 정수, 문자열 및 ArrayList는 어떻습니까?"

"그들은 모두 직렬화를 지원합니다. Java의 제작자는 이러한 일이 발생하도록 특별한 주의를 기울였습니다. 여기에는 문제가 없어야 합니다."

또한 객체가 직렬화될 때 객체의 유형이 저장됩니다. 이제 Object 변수에 Cat 개체에 대한 참조를 저장할 수 있습니다. 모든 것이 잘 직렬화 및 역직렬화됩니다.

"역직렬화?"

" 역직렬화 는 직렬화를 역순으로 처리하는 과정입니다. 즉, 스트림/파일에서 객체를 읽고 재구성하는 것입니다."

"아, 그럼 더 이상 질문하지마."