직렬화
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
직렬화는 데이터를 전송, 저장 또는 원격 프로시저 호출 등에 사용하기 위해 데이터 구조를 일련의 바이트로 변환하는 과정이다. 아키텍처 독립성을 유지하고, 포인터 참조를 처리하기 위해 언스위즐링 및 스위즐링 단계를 포함할 수 있다. 직렬화는 캡슐화 위반, 독점 형식 사용, 비선형적 데이터 구조 처리의 어려움과 같은 단점을 가질 수 있지만, 데이터의 상태를 유지하고 전달하기 위한 간단한 I/O 인터페이스를 제공한다. 다양한 직렬화 형식(XDR, XML, JSON, YAML 등)이 있으며, 여러 프로그래밍 언어에서 객체 직렬화를 직접 지원하거나 라이브러리를 통해 지원한다. 또한, 멀티 스레드 프로그래밍에서의 순차화와 관련하여, 여러 스레드가 자원에 동시에 접근하는 것을 제어하는 데 사용된다.
직렬화는 다음과 같은 다양한 용도로 사용된다.
제록스 네트워크 시스템즈(Xerox Network Systems)의 Courier 기술은 1980년대 초 최초로 널리 채택된 표준에 영향을 미쳤다. 썬 마이크로시스템즈(Sun Microsystems)는 1987년에 외부 데이터 표현(XDR)을 발표했다.[6] XDR은 개방형 형식이며, [https://tools.ietf.org/html/std67 STD 67](RFC 4506)으로 표준화되었다.
많은 객체 지향 프로그래밍 언어가 ''객체 직렬화''(또는 ''객체 보관'')를 직접 지원한다. 이는 구문 설탕 요소나 표준 인터페이스를 통해 제공된다. 이러한 언어에는 루비, 스몰토크, 파이썬, PHP, Objective-C, 델파이, 자바, .NET 계열 언어가 있다. 또한, 직렬화를 기본적으로 지원하지 않는 언어에 직렬화 지원을 추가하는 라이브러리도 존재한다.
순차화는 주로 멀티 스레드 프로그래밍에서 사용되는 용어이다. 여러 개의 스레드가 어떤 자원에 동시에 접근해도 문제가 발생하지 않도록, 동시 접근 요청이 발생했을 때 각 스레드가 차례대로 해당 자원을 이용하도록 조정하는 것을 말한다. 순차화를 통해 프로그램은 스레드 세이프가 된다.
직렬화는 잠재적으로 개인적인 구현 세부 사항을 노출함으로써 추상 자료형의 불투명성을 깨뜨릴 수 있다. 모든 데이터 멤버를 직렬화하는 단순한 구현은 캡슐화를 위반할 수 있다.[5]
[1]
웹사이트
C++ FAQ: "What's This "Serialization" Thing All About?"
http://www.parashift[...]
2. 용도
이러한 기능들이 제대로 작동하려면 아키텍처 독립성을 유지해야 한다. 예를 들어, 서로 다른 하드웨어 아키텍처에서 실행되는 컴퓨터들이 엔디안에 관계없이 직렬화된 데이터를 안정적으로 재구성할 수 있어야 한다. 아키텍처 독립적인 형식으로 데이터 구조를 직렬화하면 바이트 순서, 메모리 레이아웃, 다른 프로그래밍 언어에서 데이터 구조를 표현하는 방식의 차이로 인해 발생하는 문제를 방지할 수 있다.[5]
직렬화는 데이터 인코딩이 직렬이기 때문에, 직렬화된 데이터 구조의 일부분을 추출하려면 전체 객체를 처음부터 끝까지 읽고 재구성해야 한다. 이는 객체의 상태를 유지하고 전달하기 위한 간단하고 일반적인 입/출력(I/O) 인터페이스를 활용할 수 있게 한다는 점에서 장점으로 작용한다. 하지만 성능이 중요한 애플리케이션에서는 더 복잡하고 비선형적인 저장소 구성을 고려해야 할 수도 있다.
단일 머신에서도 포인터(컴퓨터 프로그래밍) 객체는 저장하기에 불안정할 수 있다. 포인터가 가리키는 객체가 메모리의 다른 위치로 다시 로드될 수 있기 때문이다. 이를 해결하기 위해 직렬화 과정에는 직접 포인터 참조를 이름이나 위치 기반 참조로 변환하는 '언스위즐링(unswizzling)' 단계가 포함되며, 역직렬화 과정에는 '포인터 스위즐링(pointer swizzling)' 단계가 포함된다.
직렬화와 역직렬화는 Microsoft Foundation Classes의 ''Serialize'' 함수와 같은 공통 코드에서 처리할 수 있다. 이 공통 코드는 두 작업을 동시에 수행하여 직렬화되는 객체와 이전 복사본 간의 차이점을 감지하고, 다음 감지를 위한 입력을 제공할 수 있다. 이를 차등 실행이라고 하며, 사용자 인터페이스 프로그래밍에 유용하다.
또한, 메모리상의 객체를 직렬화하여 스토리지상의 파일 등의 영구 기억 장치에 저장하는 것을 영속화라고 한다.
2. 1. 직렬화와 불투명성
직렬화는 추상 데이터 형식의 비공개 구현 세부 정보를 노출하여 불투명성을 깨뜨릴 수 있다. 모든 데이터 멤버를 직렬화하는 단순한 구현은 캡슐화를 위반할 수 있다.[5]
경쟁 업체가 호환되는 제품을 만드는 것을 막기 위해, 독점 소프트웨어 게시자는 종종 해당 프로그램의 직렬화 형식에 대한 세부 정보를 영업 비밀로 유지하는 경우가 많다. 일부는 직렬화된 데이터를 의도적으로 난독화하거나 심지어 암호화하기도 한다. 그러나 상호 운용성을 위해서는 애플리케이션이 서로의 직렬화 형식을 이해할 수 있어야 한다. 따라서 CORBA와 같은 원격 메서드 호출 아키텍처는 직렬화 형식을 자세히 정의한다.
기록 보관소 및 도서관과 같은 많은 기관에서는 백업 아카이브, 특히 데이터베이스 덤프를 비교적 사람이 읽을 수 있는 직렬화 형식으로 저장하여 미래 보장을 하려고 노력한다.
3. 직렬화 형식
1990년대 후반에는 표준 직렬화 프로토콜에 대한 대안을 제공하려는 움직임이 시작되었다. XML은 SGML의 하위 집합으로, 사람이 읽을 수 있는 텍스트 기반 인코딩을 생성하는 데 사용되었다. 이러한 인코딩은 사람이 읽고 이해할 수 있거나 프로그래밍 언어에 관계없이 다른 시스템과 통신할 수 있는 영구적인 객체에 유용할 수 있다는 장점이 있다. 단점은 더 압축된 바이트 스트림 기반 인코딩을 잃는 것이지만, 이 시점에는 더 큰 저장 및 전송 용량으로 인해 파일 크기가 컴퓨팅 초기보다 덜 중요해졌다. 2000년대에는 XML이 Ajax 웹 애플리케이션에서 클라이언트와 서버 간의 비동기적 구조화된 데이터 전송에 자주 사용되었다. XML은 개방형 형식이며, [https://www.w3.org/TR/xml11/ W3C 권고안]으로 표준화되었다.
JSON은 XML의 가벼운 일반 텍스트 대안이며 웹 애플리케이션에서 클라이언트-서버 통신에도 일반적으로 사용된다. JSON은 자바스크립트 구문을 기반으로 하지만 자바스크립트와 독립적이며 다른 많은 프로그래밍 언어에서 지원된다. JSON은 개방형 형식이며 [https://tools.ietf.org/html/std90 STD 90] , [http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf ECMA-404], [https://www.iso.org/standard/71616.html ISO/IEC 21778:2017]로 표준화되었다.
YAML은 JSON의 엄격한 상위 집합이며 데이터 유형 태그, 순환 데이터 구조 지원, 들여쓰기 감지 구문 및 여러 형태의 스칼라 데이터 인용과 같은 추가 기능을 포함한다. YAML은 개방형 형식이다.
속성 목록은 넥스트스텝(NeXTSTEP), GNUstep, macOS, 및 iOS 소프트웨어 프레임워크에서 직렬화에 사용된다. ''p-list''라고도 하는 ''속성 목록''은 단일 직렬화 형식을 지칭하는 것이 아니라 여러 가지 다른 변형을 지칭하며, 일부는 사람이 읽을 수 있고 일부는 이진 형식이다.
위성 데이터 및 수치 기후, 날씨 또는 해양 모델의 출력과 같은 대용량 과학 데이터 세트의 경우, HDF, netCDF 및 이전 GRIB과 같은 특정 이진 직렬화 표준이 개발되었다.
텍스트로 직렬화할 때의 형식으로는, 많은 텍스트 파일 형식 중에서도 규격으로 표준화되어 있고, 계층 구조의 표현을 지원하며, 역직렬화가 비교적 용이한 XML이나 JSON 등이 많이 사용된다. 텍스트 인코딩의 문자 집합에는 예전부터 다양한 형식이 존재하지만, 유니코드가 보급된 이후에는 UTF-8이 많이 사용된다. UTF-8에서는, ASCII 범위 내에서는 각 문자가 1바이트 이내(7비트)로 표현될 수 있기 때문에, ASCII 문자가 차지하는 비율이 높은 데이터의 경우 직렬화 후 데이터 용량을 절약할 수 있다. 또한, 바이트 단위의 인코딩이며, 엔디안의 영향을 받지 않는다는 장점도 있다. 비 ASCII 문자는 멀티바이트 문자로 표현해야 하지만, 일본어와 같은 멀티바이트 문자가 차지하는 비율이 높은 데이터의 경우에는, UTF-8보다 UTF-16이 데이터 용량을 절약할 수 있는 경우도 있다. 수치 데이터가 많은 경우에는, 바이너리 형식을 이용하면 더 많은 용량을 절약할 수 있지만, 원래의 객체를 확장한 경우에도 호환성을 유지하기 위해서는, 텍스트 형식과 비교하여 형식 설계의 난이도가 높아진다. 또한, 부동 소수점 수를 10진수 표기의 문자열로 직렬화하면 반올림 오차가 발생하여, 역직렬화 시 정보를 정확하게 복원할 수 없는 경우가 있다.
4. 프로그래밍 언어 지원
.NET은 여러 개의 직렬 변환기를 가지고 있으며, Windows Communication Foundation(WCF)에서는 데이터 계약을 활용하여 객체의 직렬화에 관한 메타데이터를 기술함으로써 프로세스 간에 .NET 객체를 쉽게 송수신할 수 있다.[53] .NET Framework/.NET Core는 각종 속성을 사용한 수식을 통해 직렬화 제어를 지원하고,[47][48] ISerializable 인터페이스[49]를 사용하는 방법도 있지만, 직렬화 제어에서는 속성을 이용하는 방법이 우선시된다. BinaryFormatter를 사용하여 바이너리 형식으로 직렬화할 수도 있지만, 바이너리 직렬화는 보안상의 위험이 있어 권장되지 않는다.[50][51] .NET Core는 JSON 직렬화도 지원한다.[52]
자바에서는 직렬화하려는 클래스에 또는 인터페이스를 구현함으로써 해당 클래스 객체를 직렬화할 수 있다.[46]
PHP에서는 표준으로 구현되어 있으며, 직렬화는 serialize(), 역직렬화는 unserialize()를 사용한다. 객체를 직렬화하면 메서드를 제외하고 저장된다.
5. 순차화 (동시성 제어)
이는 일반적으로 해당 자원을 잠글 수 있는 하나의 스레드만 해당 자원을 사용할 수 있으며, 잠금 상태에서는 다른 스레드가 해당 자원을 잠글 수 없는 메커니즘(상호 배제)을 사용하거나, 또는 atomic 명령어를 사용한 lock-free 알고리즘을 이용함으로써 실현된다.[45] 장시간의 잠금으로 인해 처리량이 저하되는 것을 피하기 위해 데이터나 요청을 일단 큐에 넣고 순차적으로 꺼내어 처리(지연 실행)함으로써 처리량을 개선하는 경우도 있지만, 여러 스레드에서 공유되는 큐 자체의 조작은 역시 상호 배제 제어가 필요하다.
그 외, 여러 프로세스가 동일한 자원(파일 등)에 접근하는 경우에도 문제가 발생하지 않도록, 마찬가지로 어떤 형태의 순차화가 필요하다.
6. 직렬화의 단점
경쟁사가 호환 제품을 만드는 것을 막기 위해, 독점 소프트웨어 발행자는 종종 해당 프로그램의 직렬화 형식에 대한 세부 정보를 영업 비밀로 유지한다. 일부는 의도적으로 직렬화된 데이터를 난독화하거나 심지어 암호화하기도 한다. 그러나 상호 운용성을 위해서는 애플리케이션이 서로의 직렬화 형식을 이해할 수 있어야 한다. 따라서 CORBA와 같이 원격 메서드 호출 아키텍처는 직렬화 형식을 상세하게 정의한다.
데이터베이스 덤프를 미래 보장하기 위해 기록 보관소와 도서관과 같은 많은 기관에서는 비교적 사람이 읽을 수 있는 직렬화 형식으로 백업 아카이브를 저장하려 한다.
참조
[2]
웹사이트
Module: Marshal (Ruby 3.0.2)
https://ruby-doc.org[...]
2021-07-25
[3]
웹사이트
Marshal
https://ocaml.org/ap[...]
2021-07-25
[4]
웹사이트
Python 3.9.6 documentation - Python object serialization —pickle
https://docs.python.[...]
[5]
웹사이트
Safe Serialization Under Mutual Suspicion
http://erights.org/d[...]
[6]
간행물
XDR: External Data Representation Standard
http://tools.ietf.or[...]
Network Working Group
2011-07-11
[7]
웹사이트
Serialization
http://www.boost.org[...]
[8]
웹사이트
s11n.net: object serialization/persistence in C++
http://s11n.net/
[9]
웹사이트
cereal Docs - Main
https://uscilab.gith[...]
[10]
웹사이트
Package encoding
https://pkg.go.dev/e[...]
2021-07-12
[11]
웹사이트
GitHub - YAML support for the Go language
https://github.com/g[...]
2021-07-25
[12]
웹사이트
proto · pkg.go.dev
https://pkg.go.dev/g[...]
2021-06-22
[13]
웹사이트
gob package - encoding/gob - pkg.go.dev
https://pkg.go.dev/e[...]
2022-03-04
[14]
웹사이트
Text.Show Documentation
http://hackage.haske[...]
2014-01-15
[15]
서적
"Effective Java: Programming Language Guide"
Addison-Wesley
[16]
웹사이트
Ask TOM "Serializing Java Objects into the database (and ge..."
https://asktom.oracl[...]
[17]
웹사이트
JSON
https://developer.mo[...]
2018-03-22
[18]
웹사이트
JSON
http://www.json.org/
2018-03-22
[19]
웹사이트
JSON: The JavaScript subset that isn't
http://timelessrepo.[...]
The timeless repository
2016-09-23
[20]
웹사이트
TC39 Proposal: Subsume JSON
https://tc39.github.[...]
ECMA TC39 committee
2018-05-22
[21]
웹사이트
Serialization
https://docs.juliala[...]
2021-07-25
[22]
웹사이트
faster and more compact serialization of symbols and strings · JuliaLang/julia@bb67ff2
https://github.com/J[...]
[23]
웹사이트
HDF5.jl: Saving and loading data in the HDF5 file format
https://github.com/J[...]
2017-08-20
[24]
웹사이트
Julia: how stable are serialize() / deserialize()
https://stackoverflo[...]
2014
[25]
웹사이트
.NET Serializers
http://geekswithblog[...]
[26]
웹사이트
SERBENCH by aumcode
https://aumcode.gith[...]
[27]
웹사이트
PHP: Object Serialization - Manual
http://ca.php.net/ma[...]
[28]
웹사이트
Shocking News in PHP Exploitation
http://www.suspekt.o[...]
2009-11-28
[29]
웹사이트
PHP: Serializable - Manual
http://www.php.net/m[...]
[30]
웹사이트
"Term reading and writing"
https://www.swi-prol[...]
[31]
웹사이트
"write_term/[2,3]"
https://sicstus.sics[...]
[32]
웹사이트
"Term input/output"
http://gprolog.org/m[...]
[33]
논문
A Value Transmission Method for Abstract Data Types
http://cs.brown.edu/[...]
1982-10
[34]
서적
Proceedings of the eleventh ACM Symposium on Operating systems principles - SOSP '87
1987-11
[35]
웹사이트
Flattening Python Objects
http://legacy.python[...]
Python Software Foundation
2017-04-06
[36]
웹사이트
11.1. pickle — Python object serialization — Python 2.7.14rc1 documentation
https://docs.python.[...]
[37]
웹사이트
pickle — Python object serialization — Python v3.0.1 documentation
https://docs.python.[...]
[38]
웹사이트
What's New In Python 3.0 — Python v3.1.5 documentation
https://docs.python.[...]
[39]
문서
R manual
http://stat.ethz.ch/[...]
[40]
문서
R manual
http://stat.ethz.ch/[...]
[41]
간행물
RProtoBuf: Efficient Cross-Language Data Serialization in R
[42]
웹사이트
MinneStore version 2
http://minnestore.so[...]
[43]
웹사이트
What's new
http://www.mars.dti.[...]
2010-01-23
[44]
웹사이트
Swift Archival & Serialization
https://github.com/a[...]
2018-12-02
[45]
문서
CON09-C. ロックフリープログラミングの手法を使うときは ABA 問題を避ける
https://www.jpcert.o[...]
[46]
서적
Javaオブジェクト直列化仕様
https://docs.oracle.[...]
オラクル (企業)
2007-12-08
[47]
문서
カスタムのシリアル化 | Microsoft Docs
https://docs.microso[...]
[48]
문서
属性を使用した XML シリアル化の制御 | Microsoft Docs
https://docs.microso[...]
[49]
문서
ISerializable Interface (System.Runtime.Serialization) | Microsoft Docs
https://docs.microso[...]
[50]
문서
バイナリ シリアル化 | Microsoft Docs
https://docs.microso[...]
[51]
문서
BinaryFormatter セキュリティ ガイド | Microsoft Docs
https://docs.microso[...]
[52]
문서
C# を使用した JSON のシリアル化と逆シリアル化 - .NET | Microsoft Docs
https://docs.microso[...]
[53]
문서
データ コントラクトの使用 - WCF | Microsoft Docs
https://docs.microso[...]
[54]
서적
PHP: オブジェクトのシリアライズ - Manual
https://www.php.net/[...]
PHP Group
2020-08-27
[55]
웹인용
C++ FAQ: "What's this "serialization" thing all about?"
http://www.parashift[...]
[56]
문서
How to marshal an object to a remote server by value by using Visual Basic 2005 or Visual Basic .NET
http://support.micro[...]
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com