"안녕하세요, 아미고! Ellie가 말한 것에 조금 추가하고 싶습니다."

경우에 따라 직렬화 프로세스를 제어해야 합니다. 그 이유는 다음과 같습니다.

1) 개체가 직렬화할 준비가 되지 않았습니다 . 현재 내부 상태가 변경되는 중입니다.

2) 개체에는 직렬화할 수 없는 개체가 포함되어 있지만 쉽게 직렬화할 수 있는 형식으로 변환할 수 있습니다( 예: 바이트 배열 또는 다른 것으로 저장).

3) 개체는 모든 데이터를 하나의 단위로 역직렬화하거나 직렬화 전에 암호화하려고 합니다.

직렬화를 수동으로 수행하려는 데는 여러 가지 이유가 있습니다. 그러나 우리는 표준 직렬화가 제공하는 모든 이점을 잃고 싶지 않습니다. 결국 객체는 다른 객체를 사용할 수 있습니다. 그러나 개체가 직렬화를 지원하지 않으면 직렬화할 수 없습니다.

이 상황에는 Externalizable 인터페이스 라는 솔루션도 있습니다 . 우리는 Java의 선견지명이 있는 제작자에게 감사해야 합니다. Serializable 인터페이스를 Externalizable 인터페이스 로 바꾸기만 하면 클래스가 직렬화 프로세스를 수동으로 관리할 수 있습니다.

Externalizable 인터페이스 에는 Serializable 인터페이스에는 없는 두 개의 메소드가 있으며 객체가 직렬화될 때 Java 시스템에서 호출됩니다. 다음과 같이 표시됩니다.

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

 public void writeExternal(ObjectOutput out)
 {
  out.writeObject(name);
  out.writeInt(age);
  out.writeInt(weight);
}

 public void readExternal(ObjectInput in)
 {
  name = (String) in.readObject();
  age = in.readInt();
  weight = in.readInt();
 }
}

생각나는 게 있나요?

"이런 몰리! 이것이 바로 우리가 직렬화를 고려하기 전에 객체를 저장하려고 시도한 방법입니다."

"이렇게 하면 모든 것이 간단해집니다. 표준 직렬화가 적합하면 직렬화 가능 인터페이스 를 상속합니다 . 적절하지 않으면 외부화 가능을 상속 하고 자체 코드를 작성하여 개체를 저장/로드합니다."

"그러나 Externalizable 로 표시된 클래스가 직렬화 가능한 것으로 간주됩니까? 이러한 클래스를 사용하여 직렬화 가능 클래스에 대한 참조를 "안전하게" 저장할 수 있습니까?"

"예. 클래스가 Serializable 또는 Externalizable 을 구현하면 직렬화 가능으로 간주됩니다."

"완벽한 솔루션입니다. 마음에 듭니다."

"그 말을 듣게 되어 기쁩니다. 하지만 더 많은 것이 있습니다... 한스 교수에게 모든 뉘앙스에 대해 물어봐야 합니다. 그것들은 확실히 존재합니다. 그는 당신에게 읽을거리를 주고 싶어했습니다."