ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ JAVA ] 직렬화 Serializable , 역직렬화 Deserialize
    JAVA 2022. 3. 17. 15:46
    λ°˜μ‘ν˜•

    직렬화 Serializable , 역직렬화 Deserialize μ •μ˜

     

    직렬화(η›΄εˆ—εŒ–) λ˜λŠ” μ‹œλ¦¬μ–ΌλΌμ΄μ œμ΄μ…˜(serialization)은 데이터 κ΅¬μ‘°λ‚˜ 였브젝트 μƒνƒœλ₯Ό λ™μΌν•˜κ±°λ‚˜ λ‹€λ₯Έ 컴퓨터 ν™˜κ²½μ— μ €μž₯

    (이λ₯Όν…Œλ©΄ νŒŒμΌμ΄λ‚˜ λ©”λͺ¨λ¦¬ λ²„νΌμ—μ„œ, λ˜λŠ” λ„€νŠΈμ›Œν¬ μ—°κ²° 링크 κ°„ 전솑)ν•˜κ³  λ‚˜μ€‘μ— μž¬κ΅¬μ„±ν•  수 μžˆλŠ” 포맷으둜 λ³€ν™˜ν•˜λŠ” 과정이닀.

    였브젝트λ₯Ό μ§λ ¬ν™”ν•˜λŠ” 과정은 였브젝트λ₯Ό λ§ˆμƒ¬λ§ν•œλ‹€κ³ λ„ ν•œλ‹€.

    λ°˜λŒ€λ‘œ, 일련의 λ°”μ΄νŠΈλ‘œλΆ€ν„° 데이터 ꡬ쑰λ₯Ό μΆ”μΆœν•˜λŠ” 일은 μ—­μ§λ ¬ν™” λ˜λŠ” λ””μ‹œλ¦¬μ–ΌλΌμ΄μ œμ΄μ…˜(deserialization)이라고 ν•œλ‹€.

     

    직렬화와 역직렬화λ₯Ό μœ„ν‚€μ—μ„œ μ •μ˜ν•œ κ²°κ³ΌλŠ” μ΄λ ‡μ§€λ§Œ κ·Έλ ‡κ²Œ μ‰½κ²Œ 와닿진 μ•Šμ•˜λ‹€. 😒

     

    κ°„λ‹¨νžˆ λ§ν•˜μžλ©΄

    μ§λ ¬ν™”λŠ” λ©”λͺ¨λ¦¬λ₯Ό λ””μŠ€ν¬μ— μ €μž₯ν•˜κ±°λ‚˜ λ„€νŠΈμ›Œν¬ 톡신에 μ‚¬μš©ν•˜κΈ° μœ„ν•œ ν˜•μ‹μœΌλ‘œ λ³€ν™˜ν•˜λŠ” 것

    μ—­μ§λ ¬ν™”λŠ” λ°˜λŒ€λ‘œ λ””μŠ€ν¬μ— μ €μž₯ν•œ 데이터λ₯Ό μ½κ±°λ‚˜, λ„€νŠΈμ›Œν¬ ν†΅μ‹ μœΌλ‘œ 받은 데이터λ₯Ό λ©”λͺ¨λ¦¬μ— μ“Έ 수 μžˆλ„λ‘ λ‹€μ‹œ λ³€ν™˜ν•˜λŠ” 것이닀.

     

    일단 직렬화와 역직렬화가 μ™œ ν•„μš”ν•œμ§€μ— λŒ€ν•΄ λ¨Όμ € μ•Œμ•„μ•Ό ν•œλ‹€κ³  μƒκ°ν–ˆλ‹€.

    μ§λ ¬ν™”λŠ” 데이터λ₯Ό μ €μž₯ ν˜Ήμ€ 톡신에 μ‚¬μš©ν•˜κΈ° μœ„ν•¨μΈλ° λ°μ΄ν„°λ₯Ό κ·Έλƒ₯ μ‚¬μš©ν•˜λ©΄ μ•ˆ 되고 μ™œ μ§λ ¬ν™”λΌλŠ” 과정을 거쳐야 ν• κΉŒ ?

     

    μ§λ ¬ν™”λŠ” μ™œ ν•„μš”ν•œκ°€? μ‚¬μš©μ΄μœ  

     

    개발 μ–Έμ–΄λ‘œ 무엇을 μ‚¬μš©ν•˜λ˜(C++, C, C#, Java λ“±,,) μ‚¬μš©ν•˜λŠ” λ°μ΄ν„°λ“€μ˜ λ©”λͺ¨λ¦¬ κ΅¬μ‘°λŠ” 크게 2κ°€μ§€λ‘œ λ‚˜λ‰œλ‹€. 

     

    1. κ°’ ν˜•μ‹ 데이터(Value Type) : μš°λ¦¬κ°€ ν”νžˆ μ„ μ–Έν•΄μ„œ μ‚¬μš©ν•˜λŠ” int, float, char λ“±, κ°’ ν˜•μ‹ 데이터듀은 μŠ€νƒμ— λ©”λͺ¨λ¦¬κ°€ μŒ“μ΄κ³  직접 접근이 κ°€λŠ₯ν•˜λ‹€.

     

    2. μ°Έμ‘° ν˜•μ‹ 데이터(Reference Type) : C#μ—μ„œ Object νƒ€μž… ν˜Ήμ€ C++μ—μ„œ 포인터 λ³€μˆ˜λ“€μ΄ 여기에 ν•΄λ‹Ήλœλ‹€. ν•΄λ‹Ή ν˜•μ‹μ˜ λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λ©΄ νž™μ— λ©”λͺ¨λ¦¬κ°€ ν• λ‹Ήλ˜κ³  μŠ€νƒμ—μ„œλŠ” 이 νž™ λ©”λͺ¨λ¦¬λ₯Ό μ°Έμ‘°ν•˜λŠ”(νž™μ— λ©”λͺ¨λ¦¬ λ²ˆμ§€ μ£Όμ†Œλ₯Ό 가지고 있음) ꡬ쑰둜 λ˜μ–΄μžˆλ‹€.

     

    이 두가지 λ°μ΄ν„° μ€‘μ—μ„œ λ””μŠ€ν¬μ— μ €μž₯ν•˜κ±°λ‚˜ ν†΅μ‹ μ—λŠ” κ°’ ν˜•μ‹ 데이터(Value Type)만 κ°€λŠ₯ν•˜λ‹€. 

    μ°Έμ‘° ν˜•μ‹ 데이터(Reference Type)λŠ” μ‹€μ œ 데이터 값이 μ•„λ‹Œ νž™μ— ν• λ‹Ήλ˜μ–΄μžˆλŠ” λ©”λͺ¨λ¦¬ λ²ˆμ§€ μ£Όμ†Œλ₯Ό 가지고 있기 λ•Œλ¬Έμ— μ €μž₯, 톡신에 μ‚¬μš©ν•  수 μ—†λ‹€.

     

    ** μŠ€νƒ, νž™

    • μŠ€νƒ 
      - κΈ°λ³Έν˜• νƒ€μž… λ³€μˆ˜λ“€κ³Ό κ·Έ 값듀이 ν•¨κ»˜ μ €μž₯λœλ‹€.
      - νž™ μ˜μ—­μ— μ €μž₯λ˜μ–΄ μžˆλŠ” μ°Έμ‘°ν˜• νƒ€μž… λ³€μˆ˜λ“€μ˜ reference(μ£Όμ†Œ)κ°€ μ €μž₯λœλ‹€.
      - 정적인 것듀이 μ €μž₯λ˜λŠ” κ³³

    • νž™
      - μ°Έμ‘°ν˜• νƒ€μž…μ˜ λ³€μˆ˜λ“€μ΄ μ €μž₯λœλ‹€. (newμ—°μ‚°μžλ₯Ό 톡해 μƒμ„±λœ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜κ°€ μ €μž₯λœλ‹€.)  
      - (cf. μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ˜ referenceλŠ” μŠ€νƒμ— μ €μž₯)
      - 동적인 것듀이 μ €μž₯λ˜λŠ” κ³³

     

    μ™œ μ°Έμ‘° ν˜•μ‹ λ°μ΄ν„°λŠ” μ‚¬μš©ν•  수 μ—†μ„κΉŒ ? 

    예λ₯Ό λ“€μžλ©΄

    포인터 λ³€μˆ˜ Class A λ₯Ό μ„ μ–Έν•˜κ³  객체λ₯Ό λ§Œλ“€μ–΄ κ·Έ μ£Όμ†Œ 값이 0x00045523라고 κ°€μ •ν•˜μž. 

    그리고 이 값을 νŒŒμΌμ— ν¬ν•¨ν•˜μ—¬ μ €μž₯ν–ˆλ‹€κ³  ν•΄λ³΄μž. 

    κ·Έ ν›„ ν”„λ‘œκ·Έλž¨μ„ μ’…λ£Œν•˜κ³  λ‹€μ‹œ μ‹€ν–‰ν•΄μ„œ μ£Όμ†Œκ°’ 0x00045523을 κ°€μ Έμ˜€λ”λΌλ„ κΈ°μ‘΄ A 객체의 데이터λ₯Ό κ°€μ Έμ˜¬ 수 μ—†λ‹€.(ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ˜λ©΄ 기쑴에 ν• λ‹Ήλ˜μ—ˆλ˜ λ©”λͺ¨λ¦¬(0x00045523)λŠ” ν•΄μ œλ˜κ³  없어진닀)

      

    λ„€νŠΈμ›Œν¬ 톡신 λ˜ν•œ λ§ˆμ°¬κ°€μ§€μ΄λ‹€.

    각 PCλ§ˆλ‹€ μ‚¬μš©ν•˜κ³ μžˆλŠ” λ©”λͺ¨λ¦¬ 곡간 μ£Όμ†ŒλŠ” μ „ν˜€ λ‹€λ₯΄λ‹€. 

    κ·Έλ ‡κΈ° λ•Œλ¬Έμ— λ‚΄κ°€ λ‹€λ₯Έ PC둜 μ „μ†‘ν•œ A객체 데이터(0x00045523)은 λ¬΄μ˜λ―Έν•˜λ‹€. 

    이 데이터λ₯Ό 받은 PCμ—μ„œμ˜ λ©”λͺ¨λ¦¬ μ£Όμ†Œ 0x00045523μ—λŠ” μ „ν˜€ λ‹€λ₯Έ 값이 μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

     

    직렬화λ₯Ό ν•˜κ²Œ 되면 각 μ£Όμ†Œκ°’μ΄ κ°€μ§€λŠ” 데이터듀을 μ „λΆ€ λŒμ–΄λͺ¨μ•„μ„œ κ°’ ν˜•μ‹(Value Type)λ°μ΄ν„°λ‘œ λ³€ν™˜ν•΄μ€€λ‹€. 

    μ΄λŸ¬ν•œ 이유 λ•Œλ¬Έμ— 데이터λ₯Ό μ €μž₯, 톡신전에 '데이터 직렬화(Serialization)' μž‘업이 ν•„μš”ν•œ 것이닀!! 

    직렬화가 된 데이터듀은 언어에 λ”°λΌμ„œ ν…μŠ€νŠΈ λ˜λŠ” λ°”μ΄λ„ˆλ¦¬ λ“±μ˜ ν˜•νƒœκ°€ λ˜λŠ”λ°, μ΄λŸ¬ν•œ ν˜•νƒœκ°€ λ˜μ—ˆμ„ λ•Œ μ €μž₯ν•˜κ±°λ‚˜ 톡신 μ‹œ νŒŒμ‹±μ΄ κ°€λŠ₯ν•œ μœ μ˜λ―Έν•œ 데이터가 λ˜λŠ” 것이닀.

     

    ν•œ 가지 μ˜ˆμ‹œλ₯Ό 더 λ§ν•˜μžλ©΄, 

    String이 ν¬μΈν„°λ‘œ κ΅¬ν˜„λ˜μ–΄μžˆλŠ” 경우 int, double λ“± κ³ΌλŠ” λ‹€λ₯΄κ²Œ λ‚΄λΆ€μ μœΌλ‘œ λ©”λͺ¨λ¦¬κ°€ μ—°μ†μ μœΌλ‘œ λ˜μ–΄μžˆμ§€ μ•Šλ‹€.(int*λŠ” 4byteμ”© double* 8byteμ”© λ©”λͺ¨λ¦¬κ°€ μ—°μ†μ μœΌλ‘œ λ°°μΉ˜λ˜μ–΄μžˆμŒ) 이 슀트링 데이터λ₯Ό λ¬΄μ‚¬νžˆ μ €μž₯ ν˜Ήμ€ μ „μ†‘ν•˜κΈ° μœ„ν•΄μ„œλŠ” 이 λ©”λͺ¨λ¦¬ 데이터듀을 μ—°μ†μ μœΌλ‘œ 배치, κ°’ νƒ€μž… λ³€μ‘° 즉 직렬화λ₯Ό ν•΄μ€˜μ•Ό ν•˜λŠ” 것이닀. 

     

    λ§ˆμ§€λ§‰μœΌλ‘œ μš”μ•½ν•΄λ³΄λ©΄

    직렬화λ₯Ό μ“°λŠ” μ΄μœ λŠ” μ‚¬μš©ν•˜κ³  μžˆλŠ” 데이터듀을 파일 μ €μž₯ ν˜Ήμ€ 데이터 ν†΅μ‹ μ—μ„œ νŒŒμ‹± ν•  수 μžˆλŠ” μœ μ˜λ―Έν•œ 데이터λ₯Ό λ§Œλ“€κΈ° μœ„ν•¨μ΄λ‹€. 

     

     

    좜처 : https://hub1234.tistory.com/26

     

    데이터 직렬화(serialization)λŠ” 무엇이고 μ™œ ν•„μš”ν•œκ°€?

    μš°μ„  이 글은 κ΅¬κΈ€λ§μ—μ„œ λ‚˜μ˜€λŠ” μ—¬λŸ¬ 가지 직렬화에 λŒ€ν•œ κΈ€λ“€κ³Ό μ„€λͺ…듀을 읽고 제 λ‚˜λ¦„λŒ€λ‘œ ν•œλ²ˆ 더 μ΄ν•΄ν•˜κΈ° νŽΈν•˜λ„λ‘ μ •λ¦¬ν•œ κΈ€μž…λ‹ˆλ‹€. 데이터 직렬화(serialization), 역직렬화(deserialization)λŠ”

    hub1234.tistory.com

    λ°˜μ‘ν˜•

    'JAVA' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

    [ JAVA ] Object Mapper : json 직렬화, 역직렬화 μ‚¬μš©λ²•  (0) 2022.03.17
    JAVA 8 : Date와 Time  (0) 2021.03.21
    JAVA 8 : Optional  (0) 2021.03.18

    λŒ“κΈ€

Designed by Tistory.