-
Notifications
You must be signed in to change notification settings - Fork 3
Description
Discussed in https://github.com/orgs/Study-2-Effective-Java/discussions/204
Originally posted by bunsung92 April 10, 2023
0. TL;DR π
- λΆλ³μμ μ§ν€κΈ° μν΄ μΈμ€ν΄μ€λ₯Ό ν΅μ νλ€λ©΄, μ΄κ±° νμ μ μ΄μ©νμ.
- μ§λ ¬νμ μΈμ€ν΄μ€ ν΅μ κ° λͺ¨λ νμνλ©΄
readResolve()
μμ±νκ³ , ν΄λμ€μ λͺ¨λ μ°Έμ‘° νμ μΈμ€ν΄μ€ νλλ₯Όtransient
ν€μλλ₯Ό μ΄μ©νμ.
1. μΈμ€ν΄μ€ μμ ν΅μ
μΈμ€ν΄μ€ μλ₯Ό ν΅μ νλ κΈ°λ²μ λ°λ‘ μ±κΈν΄
μ΄λ€.
κ·Έλ¦¬κ³ μ§λ ¬ν
μ μ±κΈν΄
μ μμ±μ΄ λ§μ§ μλ€.
λ°λ‘ implement Serializable
μ μΆκ°νλ μκ° μ±κΈν΄μ΄ μλκ² λκΈ° λλ¬Έμ΄λ€.
κΈ°λ³Έ μ§λ ¬νλ₯Ό μ°μ§ μλλΌλ (μμ΄ν
87)
λͺ
μμ μΈ readObject()
(μμ΄ν
88) λ₯Ό μ 곡νλλΌλ μμ©μλ€.
μ΄λ€ readObject()
λ₯Ό μ¬μ©νλ μ΄ ν΄λμ€κ° μ΄κΈ°νλ λ λ§λ€μ΄μ§ μΈμ€ν΄μ€μλ λ³κ°μ μΈμ€ν΄μ€λ₯Ό λ°ννκΈ° λλ¬Έμ΄λ€.
2. readResolve()
readObject()
κ° λ³κ°μ μΈμ€ν΄μ€λ₯Ό λ°ννκΈ°λ§μ λ§λ₯ κΈ°λ€λ¦΄ μ μλ€.
readResolve()
λ₯Ό κ°μ©νμ¬ νμ°μ μΌλ‘ μλ³Έμ Instanceλ₯Ό λ°ννκ² μ§μν μ μλ€.
public class Foo {
private static final Foo INSTANCE = new Foo();
private Foo() {
}
public static Foo getINSTANCE() {
return INSTANCE;
}
// readResolve λ©μλλ₯Ό μ μνλ€.
private Object readResolve() {
// μ±κΈν΄μ 보μ₯νκΈ° μν¨!
return INSTANCE;
}
}
μ΄λ λ§μ½μ μ±κΈν΄ ν΄λμ€μ νλκ° μ‘΄μ¬νλ€λ©΄, ν΄λΉ νλλ λ°λμ λͺ¨λλ€ transient
ν€μλλ₯Ό μΆκ°ν΄μΌνλ€.
readResolve()
κ° μνλκΈ°μ μ μ μ§λ ¬νλ κ°μ²΄μ μ°Έμ‘°λ₯Ό 곡격ν μ¬μ§κ° λ¨λλ€.
2.1 deep To readResolve()
- readObject()λ ObjectInputStreamν΄λμ€ μ κΈ°μ‘΄ λ©μλμ.
- μμ§λ ¬ν readObject()λ©μλλ μμ§λ ¬ν μ€μΈ κ°μ²΄μ readResolve()λ©μλκ° κ΅¬νλμ΄ μλμ§ μ¬λΆλ₯Ό λ΄λΆμ μΌλ‘ νμΈν¨.
- λ©μλκ° μ‘΄μ¬ νλ©΄ readResolve()νΈμΆλ¨.
μ¦ κ΅¬ν μ¬λΆλ₯Ό νλ¨νμ¬
readResolve()
λ₯Ό νΈμΆνκΈ° μ μ μ΄λ€ λμμ ν΄λ²λ¦¬λ©΄ λ§κΈ° μ΄λ €μμ§λ¨ λ§μ!
readResolve()μ λλ ν΄λμ€
3. μ±κΈν΄κ³Ό μ΄κ±° νμ
-
μ§λ ¬ν κ°λ₯ν μΈμ€ν΄μ€ ν΅μ ν΄λμ€λ₯Ό μ΄κ±° νμ μ μ΄μ©ν΄ ꡬννλ©΄, μ μΈν μμ μΈμ λ€λ₯Έ κ°μ²΄κ° μ‘΄μ¬νμ§ μλλ€λκ²μ
μλ°
κ° λ³΄μ¦νλ€.- νμ§λ§
native μ½λ
κΉμ§ μ‘°μνλ€λ©΄ μ΄λ μμ νμ§ μμ μ μλ€.
- νμ§λ§
-
readResolve()λ μμ ν μΈλͺ¨ μμ΄μ§κ²μ΄ μλλ€.
- μ§λ ¬ν κ°λ₯ μΈμ€ν΄μ€ ν΅μ ν΄λμ€λ₯Ό μμ±ν΄μΌ νλλ°, μ»΄νμΌμλ μ΄λ€ μΈμ€ν΄μ€λ€μ΄ μλμ§ μ μ μλ μν©μ΄λΌλ©΄, μ΄κ±°νμ μΌλ‘ νννλ κ²μ΄ λΆκ°λ₯νκΈ° λλ¬Έμ΄λ€.
3.1 readResolve()μ μ κ·Όμ μ΄μ
- final Class μμλ readResolve()λ privateμΌλ‘ μ μΈν΄μΌνλ€.
- final Classκ° μλ κ²½μ°μλ package-private, protected, publicμΌλ‘ ν΄λΉ λ©μλλ₯Ό μ μ ν μ μλλ° μ΄λ μ£Όμ ν μ μ΄μλ€.
νμ ν΄λμ€μμ readResolve()λ₯Ό μ¬μ μ νμ§ μκ³ ν λ³νμ ν΅ν΄ ν΄λΉ μ§λ ¬νλ₯Ό μ΄μ© νλ€λ©΄,
ClassCastException
μ΄ λ°μνλ€.
μ 리νμλ©΄ λ°λμ νμ ν΄λμ€μμλ readResolve()λ₯Ό μ μν΄μΌ νλ€λ κ²μ΄λ€!
4. ν΅μ¬ μ 리 π
- λ΄κ° 컀μ€ν μ§λ ¬νλ₯Ό νκ³ μκ³ , μ±κΈν΄ μΈμ€ν΄μ€λ₯Ό 보μ₯ ν΄μΌνλ€λ©΄, λκ°μ§ μ νκΆμ΄ μλ€λκ±Έ μΈμ§νμ.
1. readResolve()
2. μ΄κ±°νμ
- λ°λμ 1μ΄ μ’κ³ , 2κ° μ’λ€. 보λ€λ κ° μν©μ μλ§κ² μ¬μ©νλλ‘ νμ.
- κ³ λ €ν μ¬νμ μ΄κ±° νμ
μ΄
readResolve()
λ³΄λ€ μ λ€.
5. νκ³ π§Ή
2023-04-23 (μΌ)
- ν΄λΉ μμ΄ν μ νκ³ λ³΄λ€ λ§μ§λ§ νκ³ λ μμ μ λν λλμ λ¨κΈ°κ³ μΆλ€.
- λ§μ§λ§ μμ΄ν μ λ§‘μ λ§μ§λ§ μ 리λ₯Ό νκ² λμκ³ , μλ°μ μ¬λ¬ μ¬λ―Έλ₯Ό μμ λ³Ό μ μμ΄μ μ’μλ κ² κ°λ€.
- μΈμ κ° λ€μ μ΄ νμ΄μ§λ‘ λμμ, μ°λ¦¬ 7μΈμ λ Έκ³ λ₯Ό λ€μ λ³΄κ² λλ€λ©΄, μ΄ μμ μ μ°λ¦° μ΄λ κ² μ΄κ³ μμꡬλ λλ μ μλ μμ λ°μμ·¨κ° λμλ€κ³ μκ°νλ€.
μ°Έμ‘° μλ£
https://madplay.github.io/post/what-is-readresolve-method-and-writereplace-method
https://stackoverflow.com/questions/1168348/java-serialization-readobject-vs-readresolve
https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%A7%81%EB%A0%AC%ED%99%94Serializable-%EC%99%84%EB%B2%BD-%EB%A7%88%EC%8A%A4%ED%84%B0%ED%95%98%EA%B8%B0