Skip to content

[item42] λžŒλ‹€λŠ” 직렬화 ν•΄μ„œλŠ” μ•ˆλœλ‹€Β #66

@gnoyes-mik

Description

@gnoyes-mik

#61

λžŒλ‹€λŠ” 직렬화 ν•΄μ„œλŠ” μ•ˆλ˜λŠ” 이유

λžŒλ‹€λ„ 읡λͺ… 클래슀처럼 직렬화 ν˜•νƒœκ°€ κ΅¬ν˜„λ³„λ‘œ(κ°€λ Ή κ°€μƒλ¨Έμ‹ λ³„λ‘œ) λ‹€λ₯Ό 수 μžˆλ‹€. λ”°λΌμ„œ λžŒλ‹€λ₯Ό μ§λ ¬ν™”ν•˜λŠ” 일은 극히 μ‚Όκ°€μ•Ό ν•œλ‹€(읡λͺ… 클래슀의 μΈμŠ€ν„΄μŠ€λ„ λ§ˆμ°¬κ°€μ§€λ‹€) - p.285 -

였라클 κ³΅μ‹λ¬Έμ„œμ—μ„œλ„ λžŒλ‹€ ν‘œν˜„μ‹κ³Ό 읡λͺ… ν΄λž˜μŠ€μ— λŒ€ν•œ 직렬화λ₯Ό 'κ°•λ ₯ν•˜κ²Œ' ꢌμž₯ν•˜μ§€ μ•Šλ‹€

κ·Έ μ΄μœ λŠ” λžŒλ‹€ ν‘œν˜„μ‹μ΄λ‚˜ 읡λͺ… ν΄λž˜μŠ€μ— λŒ€ν•΄μ„œ 직렬화λ₯Ό ν•  λ•Œ, μžλ°” μ»΄νŒŒμΌλŸ¬κ°€ νŠΉμ • ꡬ문에 λŒ€ν•΄μ„œ Synthetic constructs(인쑰 ꡬ문이 λ§žλŠ” λ²ˆμ—­ κ°™μŒ)을 μ‚½μž…ν•˜λŠ”λ° 이 Synthetic constructsλŠ” 컴파일러의 κ΅¬ν˜„ 방식에 λ”°λΌμ„œ λ‹€λ₯Ό 수 μžˆλ‹€.
이 μ˜λ―ΈλŠ” '.class' νŒŒμΌλ„ 컴파일러 κ΅¬ν˜„μ— 따라 λ‹€λ₯Ό 수 μžˆμŒμ„ μ˜λ―Έν•œλ‹€. λ‚΄μš© 보기

결과적으둜 μœ„μ˜ μ΄μœ μ— μ˜ν•΄μ„œ λ‹€λ₯Έ 컴파일러λ₯Ό μ‚¬μš©ν•˜κ³  μžˆλŠ” 경우 ν˜Έν™˜μ„±μ˜ λ¬Έμ œκ°€ λ°œμƒν•  수 있기 λ•Œλ¬Έμ— 직렬화λ₯Ό ν•˜λŠ”κ²ƒμ€ κ°•ν•˜κ²Œ ꢌμž₯ν•˜μ§€ μ•ŠλŠ”λ‹€!


λžŒλ‹€λ₯Ό 직렬화 ν•˜λŠ” 방법

ν•˜μ§€λ§Œ λ•Œμ— λ”°λΌμ„œ λžŒλ‚˜ ν‘œν˜„μ‹μ΄λ‚˜ 읡λͺ… ν΄λž˜μŠ€κ°€ ν¬ν•¨λœ 클래슀λ₯Ό 직렬화λ₯Ό ν•΄μ•Όν•  λ•Œλ„ μžˆμ„ 수 μžˆλ‹€

λ¨Όμ €, λžŒλ‹€κ°€ μ •μ˜λœ 클래슀λ₯Ό λƒ…λ‹€ 직렬화/역직렬화λ₯Ό ν•΄λ³΄μž
%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2022-11-10_15 11 27

main λ©”μ†Œλ“œμ—μ„œ ν…ŒμŠ€νŠΈ 방법은 λ‹€μŒκ³Ό κ°™λ‹€

  1. Runnable 객체 fn νšλ“
  2. fn μ‹€ν–‰
  3. fn 직렬화 ν›„ 파일둜 μ €μž₯
  4. 파일 역직렬화
  5. 역직렬화 된 객체 deserializedFn μ‹€ν–‰

main λ©”μ†Œλ“œλ₯Ό μ‹€ν–‰ 해보면
%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2022-11-10_14 57 54

직렬화λ₯Ό ν•˜λ €κ³  ν•  λ•Œ **NotSerializableException**이 λ°œμƒν•˜λ©΄μ„œ 직렬화에 μ‹€νŒ¨ν•œλ‹€..

λžŒλ‹€ 직렬화λ₯Ό ν•˜λ©΄ μ•ˆλœλ‹€κ³  ν–ˆμ§€,, ν•˜μ§€ λͺ»ν•œλ‹€κ³ λŠ” μ•ˆ ν–ˆμž–μ•„,,

class νŒŒμΌμ„ 봐도 별 λ¬Έμ œκ°€ μ—†μ–΄λ³΄μ΄λŠ”λ°..

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2022-11-10_15 17 07

κ·Έλ ‡λ‹€,,,! 읡λͺ… 클래슀의 생성,λ™μž‘ 방식은 컴파일 νƒ€μž„μ— κ²°μ •λ˜μ§€λ§Œ, λžŒλ‹€λŠ” λŸ°νƒ€μž„μ— μ‹€μ œ ν˜ΈμΆœμ‹œ κ²°μ •λœλ‹€κ³  ν•œλ‹€. (invokedynamic)

κ·Έλ ‡κΈ° λ•Œλ¬Έμ— javaλ₯Ό μ‹€ν–‰ μ‹œν‚¬ λ•Œ -Djdk.internal.lambda.dumpProxyClasses={output-dir} μ˜΅μ…˜μ„ λ„£μ–΄μ£Όκ²Œ 되면 μ‹€μ œ λžŒλ‹€κ°€ μƒμ„±λ˜λŠ” 클래슀 νŒŒμΌμ„ λ³Ό 수 μžˆλ‹€.

❗ -Djdk.internal.lambda.dumpProxyClasses μ˜΅μ…˜ μ‚¬μš© μ‹œ 같이 μ‚¬μš©λ˜κ³  μžˆλŠ” λͺ¨λ“  λΌμ΄λΈŒλŸ¬λ¦¬μ— λŒ€ν•œ class 파일이 생성될 수 μžˆλ‹€

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2022-11-10_15 33 10

μš°λ¦¬κ°€ 일반적으둜 직렬화λ₯Ό ν•  λ•Œ ν•˜λŠ” λ°©μ‹μœΌλ‘œ NotSerializableLambdaExpression ν΄λž˜μŠ€μ— Serializable μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ„ μ–Έν–ˆμ§€λ§Œ,, μœ„ μ˜΅μ…˜μœΌλ‘œ μƒμ„±λœ λžŒλ‹€μ˜ class νŒŒμΌμ„ 보면 Serializable μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜κ³  μžˆμ§€ μ•Šλ‹€..

λžŒλ‹€λ₯Ό 직렬화 ν•˜λ €λ©΄ νƒ€μž… 캐슀트(Type cast)λ₯Ό ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€

μš°λ¦¬κ°€ μ„ μ–Έν•œ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ™€ Serializeble μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ²°ν•©ν•œ νƒ€μž…μœΌλ‘œ λžŒλ‹€μ‹μ„ νƒ€μž… μΊμŠ€νŒ…μ„ ν•΄μ•Όλœλ‹€

예λ₯Όλ“€μ–΄ μš°λ¦¬κ°€ μ‚¬μš©ν•˜κ³  μžˆλŠ” ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λŠ” Runnable이고 이λ₯Ό νƒ€μž… μΊμŠ€νŒ…ν•˜λ©΄ μ•„λž˜μ™€ κ°™λ‹€
%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2022-11-10_15 42 02

νƒ€μž… μΊμŠ€νŒ…μ„ ν•΄μ€€ λ’€ μƒμ„±λœ λžŒλ‹€ class νŒŒμΌμ„ μ‚΄νŽ΄λ³΄λ©΄
%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2022-11-10_15 44 39

μ „ κ³ΌλŠ” λ‹€λ₯΄κ²Œ Runnableκ³Ό Serializable μΈν„°νŽ˜μ΄μŠ€λ₯Ό λͺ¨λ‘ κ΅¬ν˜„ν•˜κ³  μžˆλŠ”κ²ƒμ„ λ³Ό 수 μžˆλ‹€!

πŸ’‘ (Runnable & Serializable) λ°©μ‹μœΌλ‘œ νƒ€μž… μΊμŠ€νŒ…μ„ 해주어도 λ˜μ§€λ§Œ μ΄λŠ” 보일러 ν”Œλ ˆμ΄νŠΈ μ½”λ“œκ°€ 될 수 μžˆμœΌλ―€λ‘œ
λͺ…μ‹œμ μœΌλ‘œ 두 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μƒμ†ν•œ μ»€μŠ€ν…€ν•œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ§Œλ“  λ’€ νƒ€μž…μΊμŠ€νŠΈλ₯Ό ν•˜λ©΄ 더 κΉ”λ”ν•˜λ‹€
ex)
interface SerializableRunnable extends Runnable, Serializable { }

(SerializableRunnable) () β†’ System.out.println(””);

νƒ€μž… 캐슀트λ₯Ό ν•΄μ€€λ’€, λ‹€μ‹œ ν•œλ²ˆ main λ©”μ†Œλ“œλ‘œ ν…ŒμŠ€νŠΈλ₯Ό ν•΄λ³΄μž!

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2022-11-10_15 51 17

μ •μƒμ μœΌλ‘œ 잘 λ™μž‘ν•˜λŠ”κ²ƒμ„ λ³Ό 수 μžˆλ‹€..πŸ‘πŸ»πŸ‘πŸ»

λžŒλ‹€ μ§λ ¬ν™”μ˜ κΈ°λ³Έ λ©”μ»€λ‹ˆμ¦˜μ— λŒ€ν•΄ 더 μƒμ„Ένžˆ μ•Œκ³  μ‹ΆμœΌλ©΄ Serialize a Lambda in Javaλ₯Ό μ°Έκ³ ν•˜μž


정리

  • λžŒλ‹€λŠ” 일반적인 직렬화 λ°©μ‹μœΌλ‘œλŠ” 직렬화 λ˜μ§€ μ•ŠμœΌλ―€λ‘œ νƒ€μž… 캐슀트λ₯Ό ν•΄μ•Όν•œλ‹€
  • ν•˜μ§€λ§Œ κ³΅μ‹μ μœΌλ‘œλŠ” λžŒλ‹€λ‚˜ 읡λͺ… ν΄λž˜μŠ€μ— λŒ€ν•œ 직렬화λ₯Ό β€˜κ°•ν•˜κ²Œβ€™ ꢌμž₯ν•˜μ§€ μ•ŠλŠ”λ‹€
  • κΌ­ ν•„μš”ν•œ κ²½μš°κ°€ μ•„λ‹ˆλΌλ©΄ λ¦¬νŒ©ν„°λ§ ν•˜λŠ”κ²ƒμ„ ꢌμž₯ν•œλ‹€

κ΄€λ ¨ μ†ŒμŠ€λŠ” μ—¬κΈ°μ—μ„œ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions