NMP-Study / EffectiveJava2018

Effective Java Study
9 stars 0 forks source link

아이템 87. 커스텀 직렬화 형태를 고려해보라 #87

Closed madplay closed 5 years ago

seryang commented 5 years ago

먼저 고민해보고 괜찮다면 기본 직렬화 형태를 사용하자

// 기본 직렬화 형태에 적합하지 않은 StringList 클래스 
public final class StringList implements Serializable {
    private int size   = 0;
    private Entry head = null;

    private static class Entry {
        String data;
        Entry  next;
        Entry  previous;
    }

   ... // 나머지 코드 생략
}

합리적인 직렬화 형태

// 합리적인 커스텀 직렬화 형태를 갖춘 StringList
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());
    }

   ... // 나머지 코드는 생략 
}

기본 직렬화 사용시 주의사항