Item 87. Custom Serialization Form

μ»€μŠ€ν…€ 직렬화 ν˜•νƒœλ₯Ό 고렀해보라

직렬화λ₯Ό κΌ­ μ‚¬μš©ν•΄μ•Όν•˜κ³ , κΈ°λ³Έ 직렬화 ν˜•νƒœλ₯Ό μ‚¬μš©ν•  수 μžˆλŠ” κ²½μš°λŠ” λ‹€μŒκ³Ό κ°™λ‹€. (κΈ°λ³Έ 직렬화 ν˜•νƒœκ°€ μ ν•©ν•˜λ”λΌλ„ λΆˆλ³€μ‹ 보μž₯κ³Ό λ³΄μ•ˆμ„ μœ„ν•΄ readObject λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•˜λŠ” 것이 μ’‹λ‹€.)

  • 직접 μ„€κ³„ν–ˆμ„ λ•Œ, κΈ°λ³Έ 직렬화 ν˜•νƒœμ™€ 거의 같은 κ²°κ³Όκ°€ λ‚˜μ˜¬ 경우

  • 객체의 물리적 ν‘œν˜„κ³Ό 논리적 λ‚΄μš©μ΄ 같은 경우

λ°˜λŒ€λ‘œ κΈ°λ³Έ 직렬화 ν˜•νƒœκ°€ μ ν•©ν•˜μ§€ μ•Šμ€ 클래슀의 μ˜ˆλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

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;
    }

    // ...
}

μœ„ ν΄λž˜μŠ€λŠ” λ‹€μŒκ³Ό 같은 νŠΉμ§•μ„ κ°€μ§€κ³  μžˆλ‹€.

  • 논리적: 일련의 λ¬Έμžμ—΄μ„ ν‘œν˜„

  • 물리적: λ¬Έμžμ—΄λ“€μ„ μ—°κ²° 리슀트둜 μ—°κ²°ν•˜μ—¬, 각 λ…Έλ“œμ˜ μ–‘λ°©ν˜• μ—°κ²° 정보가 기둝 됨

이처럼 물리적/논리적 ν‘œν˜„μ— 차이가 μ‘΄μž¬ν•  λ•Œ κΈ°λ³Έ 직렬화 ν˜•νƒœλ₯Ό μ‚¬μš©ν•˜λ©΄ λ„€ κ°€μ§€ λ©΄μ—μ„œ λ¬Έμ œκ°€ λ°œμƒν•œλ‹€.

  1. 곡개 APIκ°€ ν˜„μž¬ λ‚΄λΆ€ ν‘œν˜„ 방식에 λ¬Άμž„: λ‚΄λΆ€ κ΅¬ν˜„ λ°©μ‹μœΌλ‘œ μ—°κ²° 리슀트λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šλ”λΌλ„ ν•΄λ‹Ή μ½”λ“œλ₯Ό μ œκ±°ν•  수 μ—†μŒ

  2. λΆˆν•„μš”ν•œ 곡간 μ°¨μ§€: κ°’ 데이터 뿐만 μ•„λ‹ˆλΌ, λ‚΄λΆ€ κ΅¬ν˜„μΈ μ—°κ²° μ •λ³΄κΉŒμ§€ μ§λ ¬ν™”λ˜μ–΄ μ €μž₯λ˜μ–΄ λΆˆν•„μš”ν•œ 곡간 μ°¨μ§€

  3. λΆˆν•„μš”ν•œ μ‹œκ°„ μ†Œλͺ¨: 객체의 λͺ¨λ“  ν•„λ“œλ₯Ό μˆœνšŒν•˜λ©΄μ„œ κ·Έ 객체가 μ°Έμ‘°ν•˜λŠ” μžˆλŠ” λ‹€λ₯Έ 객체듀도 직렬화 ν•˜λŠ”λ°, 객체 κ·Έλž˜ν”„μ˜ μœ„μƒμ— λŒ€ν•œ 정보가 μ—†μ–΄ 직렬화에 λ§Žμ€ μ‹œκ°„μ΄ μ†Œμš”λ¨

  4. μŠ€νƒ μ˜€λ²„ν”Œλ‘œμš°: κΈ°λ³Έ 직렬화 과정은 객체 κ·Έλž˜ν”„λ₯Ό μž¬κ·€ μˆœνšŒν•˜λŠ”λ°, κ·Έ κ³Όμ •μ—μ„œ μŠ€νƒ μ˜€λ²„ν”Œλ‘œμš°κ°€ λ°œμƒν•  수 있음

λ•Œλ¬Έμ— κΈ°λ³Έ 직렬화 방식은 ν”Όν•˜λŠ” 것이 쒋은데, μœ„ μ˜ˆμ‹œ 클래슀의 합리적인 직렬화 ν˜•νƒœλŠ” λ‹€μŒκ³Ό 같이 κ΅¬ν˜„ν•΄ λ³Ό 수 μžˆλ‹€.

λ³€κ²½ 된 μ£Όμš” νŠΉμ§•μ€ λ‹€μŒκ³Ό κ°™λ‹€.

  1. size, head ν•„λ“œ transient 적용: 직렬화 λŒ€μƒμ—μ„œ μ œμ™Έ

  2. Entry 클래슀 Serializable μΈν„°νŽ˜μ΄μŠ€ 제거: 직렬화 λŒ€μƒμ—μ„œ μ œμ™Έ

  3. writeObject, readObject λ©”μ„œλ“œ κ΅¬ν˜„: 직렬화 ν˜•νƒœλ₯Ό μ»€μŠ€ν…€ν•˜μ—¬ 직렬화/역직렬화 μˆ˜ν–‰

  4. defaultWriteObject, defaultReadObject λ©”μ„œλ“œ 호좜: ν–₯ν›„ λ¦΄λ¦¬μŠ€μ—μ„œ transient ν•„λ“œκ°€ μΆ”κ°€/제거 μ‹œ ν˜Έν™˜ κ°€λŠ₯

λ‹€λ₯Έ 자료ꡬ쑰 μ‚¬μš© μ‹œ

사싀 StringList의 κΈ°λ³Έ 직렬화 ν˜•νƒœλ„ λ¬Έμ œκ°€ λ§Žμ•˜μ§€λ§Œ, 더 λ§Žμ€ λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆλŠ”λ°, ν•΄μ‹œν…Œμ΄λΈ”μ˜ 경우 λ‹€μŒκ³Ό 같은 λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆλ‹€.

  1. ν•΄μ‹œν…Œμ΄λΈ”μ€ 물리적으둜 ν‚€-κ°’ μ—”νŠΈλ¦¬λ₯Ό 담은 ν•΄μ‹œ 버킷을 μ°¨λ‘€λ‘œ λ‚˜μ—΄ν•œ ν˜•νƒœλ‘œ μ €μž₯

  2. μ–΄λ–€ μ—”νŠΈλ¦¬λ₯Ό μ–΄λ–€ 버킷에 담을 μ§€λŠ” ν‚€μ—μ„œ κ΅¬ν•œ ν•΄μ‹œμ½”λ“œλ‘œ κ²°μ‘λ˜λŠ”λ°, 계산할 λ•Œλ§ˆλ‹€ λ‹¬λΌμ§€λŠ” κ²½μš°κ°€ 있음

  3. 직렬화 ν›„ μ—­μ§λ ¬ν™”ν•˜λ©΄ λ‹€λ₯Έ ν•΄μ‹œμ½”λ“œκ°€ λ‚˜μ˜€κ²Œ λ˜μ–΄, ν›Όμ†λœ 객체가 생성될 수 있음

κ·Έ μ™Έ μ£Όμ˜μ‚¬ν•­

  • transient ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ ν•΄λ‹Ή ν•„λ“œλ“€μ€ 역직렬화될 λ•Œ ν•΄λ‹Ή νƒ€μž…μ˜ κΈ°λ³Έκ°’μœΌλ‘œ μ΄ˆκΈ°ν™”λ¨

  • 클래슀 λ‚΄μ—μ„œ 동기화 λ©”μ»€λ‹ˆμ¦˜ μ‚¬μš©ν•˜λŠ” λ©”μ„œλ“œ μ‚¬μš© μ‹œ, writeObject, readObject λ©”μ„œλ“œμ—μ„œλ„ 동기화 λ©”μ»€λ‹ˆμ¦˜μ„ μ‚¬μš©ν•΄μ•Ό 함

  • 직렬화 κ°€λŠ₯ 클래슀 λͺ¨λ‘μ— 직렬 버전 UIDλ₯Ό λͺ…μ‹œμ μœΌλ‘œ λΆ€μ—¬

    • 직렬 버전 UIDκ°€ μΌμœΌν‚€λŠ” 잠재적인 ν˜Έν™˜μ„± 문제 ν•΄κ²° κ°€λŠ₯

    • λŸ°νƒ€μž„μ—μ„œ μƒμ„±ν•˜λŠ” μ‹œκ°„ 단좕 κ°€λŠ₯

    • κΈ°μ‘΄ 버전 클래슀 ν˜Έν™˜μ„± μœ μ§€ μ‹œ UID μœ μ§€ / ν˜Έν™˜μ„± λŠμ„ μ‹œ UID λ³€κ²½

Last updated

Was this helpful?