Thanks to visit codestin.com
Credit goes to github.com

Skip to content

μ•„μ΄ν…œ 89. μΈμŠ€ν„΄μŠ€ 수λ₯Ό ν†΅μ œν•΄μ•Ό ν•œλ‹€λ©΄ readResolveλ³΄λ‹€λŠ” μ—΄κ±° νƒ€μž…μ„ μ‚¬μš©ν•˜λΌ - FinΒ #210

@Irisation23

Description

@Irisation23

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()λ₯Ό μ‚¬μš©ν•˜λ“  이 ν΄λž˜μŠ€κ°€ μ΄ˆκΈ°ν™”λ  λ•Œ λ§Œλ“€μ–΄μ§„ μΈμŠ€ν„΄μŠ€μ™€λŠ” λ³„κ°œμ˜ μΈμŠ€ν„΄μŠ€λ₯Ό λ°˜ν™˜ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

image


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

Metadata

Metadata

Assignees

Labels

12μž₯ μ§λ ¬ν™”μ΄νŽ™ν‹°λΈŒ μžλ°” 12μž₯ (직렬화)

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions