객체의 물리적 표현과 논리적 내용이 같다면 기본 직렬화 형태라도 무방
- 물리적 표현 → 코드로 어떻게 구현했는지
- 논리적 내용 → 실제로 어떤 것을 의미하는지
public class Name implements Serializable { /** * 성. null이 아니어야 한다. * @serial */ private final String lastName;
/**
* 이름. null이 아니어야 한다.
* @serial
*/
private final String firstName;
/**
* 중간이름. 중간이름이 없다면 null
* @serial
*/
private final String middleName;
... // 나머지 코드는 생략
}
- 성명은 논리적으로 이름, 성, 중간이름이라는 3개의 문자열로 구성
- 앞 코드의 인스턴스 필드들은 이 논리적 구성요소를 정확히 반영
논리적, 물리적 표현 다르면 적합 x
```java
public final class StringList implements Serializable {
private int size = 0;
private Entry head = null;
private static class Entry implements Serializable {
String data;
Entry next;
Entry previous;
}
// ... 생략
}
객체의 물리적 표현과 논리적 표현의 차이가 클 때 기본 직렬화 형태를 사용하면 아래의 4가지 문제
public final class StringList implements Serializable {
private transient int size = 0;
private transient Entry head = null;
// 이제는 직렬화되지 않는다.
private static class Entry {
String data;
Entry next;
Entry previous;
}
// 지정한 문자열을 이 리스트에 추가한다.
public final void add(String s) {...}
/**
* 이 {@code StringList} 인스턴스를 직렬화한다.
*
* @serialData 이 리스트의 크기(포함된 문자열의 개수)를 기록한 후
* ({@code int}), 이어서 모든 원소를(각각은 {@code String})
* 순서대로 기록한다.
*/
private void writeObject(ObjectOutputStream s) throws IOException {
//기본 직렬화를 수행한다.
s.defaultWriteObject();
s.writeInt(size);
// 커스텀 역직렬화를 수행한다.
// 모든 원소를 올바른 순서로 기록한다.
for (Entry e = head; e != null; e = e.next)
s.writeObject(e.data);
}
private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException {
//기본 역직렬화를 수행한다.
s.defaultReadObject();
int numElements = s.readInt();
// 커스텀 역직렬화 부분
// 모든 원소를 읽어 이 리스트에 삽입한다.
for(int i = 0; i < numElements; i++) {
add((String) s.readObject());
}
}
https://devfunny.tistory.com/861?category=895441
https://github.com/Meet-Coder-Study/book-effective-java/blob/main/12%EC%9E%A5/87_%EC%BB%A4%EC%8A%A4%ED%85%80_%EC%A7%81%EB%A0%AC%ED%99%94_%ED%98%95%ED%83%9C%EB%A5%BC_%EA%B3%A0%EB%A0%A4%ED%95%98%EB%9D%BC_%EB%B0%95%EC%86%8C%EC%A0%95.md
https://jaehun2841.github.io/2019/03/17/effective-java-item87/#%EC%8A%A4%ED%83%9D-%EC%98%A4%EB%B2%84%ED%94%8C%EB%A1%9C%EB%A5%BC-%EC%9D%BC%EC%9C%BC%ED%82%AC-%EC%88%98-%EC%9E%88%EB%8B%A4