시리얼화

Serialization

컴퓨팅에서 시리얼라이제이션(미국 및 옥스퍼드 철자) 또는 시리얼라이제이션(영국 철자)은 데이터 구조 또는 객체 상태를 저장(를 들어 파일 또는 메모리 데이터 버퍼에)하거나 전송(를 들어 컴퓨터 네트워크를 통해)한 후 나중에 재구성할 수 있는 형식으로 변환하는 프로세스입니다.시리얼라이제이션 포맷에 따라 일련의 비트를 다시 읽으면 원래 오브젝트의 의미상 동일한 클론을 작성할 수 있습니다.[1]참조를 광범위하게 사용하는 개체와 같은 많은 복잡한 개체의 경우 이 프로세스는 간단하지 않습니다.개체 지향 개체를 직렬화할 때 이전에 연결된 메서드는 포함되지 않습니다.

오브젝트를 시리얼화하는 이 프로세스를 상황에 [2][3][4]따라 오브젝트 마샬링이라고도 합니다.일련의 바이트에서 데이터 구조를 추출하는 반대 동작은 역직렬화(비직렬화 또는 비마샬링이라고도 함)입니다.

사용하다

방법:

이러한 기능 중 일부를 유용하게 사용하기 위해서는 아키텍처의 독립성이 유지되어야 합니다.예를 들어, 배분을 최대한 활용하기 위해 다른 하드웨어 아키텍처에서 실행되는 컴퓨터는 엔디안성에 관계없이 시리얼화된 데이터 스트림을 신뢰성 있게 재구성할 수 있어야 합니다.즉, 데이터 구조의 메모리 레이아웃을 직접 복사하는 더 간단하고 빠른 절차가 모든 아키텍처에서 안정적으로 작동할 수 없습니다.아키텍처에 의존하지 않는 형식으로 데이터 구조를 직렬화하는 것은 바이트 순서, 메모리 레이아웃 또는 단순히 다른 프로그래밍 언어로 데이터 구조를 표현하는 다른 방법의 문제를 방지하는 것을 의미합니다.

데이터의 부호화는 정의상 시리얼이기 때문에 시리얼화된 데이터 구조의 일부를 추출하려면 오브젝트 전체를 처음부터 끝까지 읽고 재구축해야 합니다.많은 애플리케이션에서 이 선형성은 자산입니다. 왜냐하면 이 선형성을 통해 단순하고 일반적인 I/O 인터페이스를 사용하여 객체 상태를 유지하고 전달할 수 있기 때문입니다.고성능이 문제가 되는 애플리케이션에서는 보다 복잡하고 비선형적인 스토리지 조직을 처리하기 위해 더 많은 노력을 기울이는 것이 현명할 수 있습니다.

단일 머신에서도 프리미티브 포인터 오브젝트는 너무 취약해서 저장할 수 없습니다.이는 포인터 오브젝트가 가리키는 오브젝트가 메모리의 다른 위치로 새로고침될 수 있기 때문입니다.이를 처리하기 위해 직렬화 프로세스에는 직접 포인터 참조가 이름 또는 위치에 따라 참조로 변환되는 unwizzling 또는 pointer unwizzling이라는 단계가 포함됩니다.역직렬화 프로세스에는 포인터 스위즐링이라고 하는 역순서가 포함됩니다.

시리얼화와 디시리얼라이즈는 모두 공통 코드(예를 들어 Microsoft Foundation ClassSerialize 함수)에서 실행할 수 있으므로 공통 코드는 동시에 실행할 수 있습니다.따라서 1) 시리얼라이즈되는 오브젝트와 그 이전 복사본 간의 차이를 검출하고 2) 다음 검출에 대한 입력을 제공합니다.on. 차분 실행이라고 불리는 기술인 차이를 즉각적으로 감지할 수 있기 때문에 실제로 이전 복사본을 작성할 필요는 없습니다.이는 내용이 시간에 따라 달라지는 사용자 인터페이스의 프로그래밍에서 유용합니다.그래픽 오브젝트는 작성, 삭제, 변경 또는 입력 이벤트를 처리하기 위해 별도의 코드를 작성할 필요가 없습니다.

결점

시리얼라이제이션은, 프라이빗 실장의 상세를 공개할 가능성이 있기 때문에, 추상적인 데이터 타입의 불투명성을 해소합니다.모든 데이터 멤버를 시리얼화하는 간단한 구현은 캡슐화를 [5]위반할 수 있습니다.

경쟁사가 호환되는 제품을 만드는 것을 막기 위해 독점 소프트웨어 출판사는 프로그램의 시리얼화 포맷에 대한 자세한 내용을 기업 기밀로 유지하는 경우가 많습니다.일부는 의도적으로 직렬화된 데이터를 난독화하거나 암호화하기도 합니다.다만, 상호 운용성을 실현하려면 , 애플리케이션이 서로의 시리얼라이제이션 형식을 이해할 수 있을 필요가 있습니다.따라서 CORBA 등의 리모트 메서드콜 아키텍처는 시리얼라이제이션 포맷을 상세하게 정의합니다.

아카이브나 라이브러리와 같은 많은 기관에서는 백업 아카이브(특히 데이터베이스 덤프)를 비교적 사람이 읽을 수 있는 시리얼 형식으로 저장함으로써 백업 아카이브(특히 데이터베이스 덤프)를 향후 검증하려고 합니다.

시리얼화 형식

1980년대 초 Xerox Network Systems Courier 기술은 널리 채택된 최초의 표준에 영향을 미쳤습니다.Sun Microsystems는 1987년에 [6]XDR(External Data Representation)을 발표했습니다.XDR은 오픈 포맷으로 STD 67(RFC 4506)로 표준화되었습니다.

1990년대 후반, 표준 직렬화 프로토콜의 대안을 제공하기 위한 노력이 시작되었다: 사람이 읽을 수 있는 텍스트 기반 인코딩을 만들기 위해 SGML 서브셋인 XML이 사용되었다.이러한 인코딩은 인간이 읽고 이해하거나 프로그래밍 언어에 관계없이 다른 시스템과 통신할 수 있는 영구 객체에 유용할 수 있습니다.콤팩트한 바이트 스트림 기반의 인코딩을 잃는다는 단점이 있지만, 이 시점에서는 저장공간과 전송용량이 커짐에 따라 파일 사이즈는 컴퓨팅 초기보다 중요하지 않게 되었습니다.2000년대에 XML은 Ajax 웹 응용 프로그램에서 클라이언트와 서버 간의 구조화된 데이터의 비동기 전송에 자주 사용되었습니다.XML은 오픈 포맷으로 W3C 권장사항으로 표준화되어 있습니다.

JSON은 XML을 대체하는 경량 플레인텍스트이며 웹 응용 프로그램에서 클라이언트와 서버 간 통신에도 일반적으로 사용됩니다.JSON은 JavaScript 구문을 기반으로 하지만 JavaScript와는 독립적이며 다른 많은 프로그래밍 언어에서 지원됩니다.JSON은 STD 90으로 표준화된 개방형 형식입니다. RFC8259) 및 ECMA-404 및 ISO/IEC 21778:2017.

YAML은 JSON의 엄격한 슈퍼셋으로 데이터 유형 태그, 주기적 데이터 구조 지원, 들여쓰기 구분 구문 및 여러 형식의 스칼라 데이터 견적 등의 추가 기능을 포함합니다.YAML은 오픈 포맷입니다.

속성 목록은 NextSTEP, GNUstep, macOSiOS 프레임워크의한 직렬화에 사용됩니다.속성 목록 또는 줄여서 p-list는 단일 직렬화 형식이 아니라 사람이 읽을 수 있는 몇 가지 다른 변형과 하나의 이진 형식을 나타냅니다.

위성 데이터 및 수치 기후, 날씨 또는 해양 모델의 출력과 같은 대규모 과학 데이터셋의 경우 HDF, netCDF 및 구형 GRIB와 같은 특정 이진 직렬화 표준이 개발되었다.

프로그래밍 언어 지원

여러 객체 지향 프로그래밍 언어는 구문 설탕 요소를 사용하거나 표준 인터페이스를 제공하여 객체 직렬화(또는 객체 아카이브)를 직접 지원합니다.이러한 언어에는 Ruby, Smalltalk, Python, PHP, Objective-C, Delphi, Java 포함됩니다.NET 언어 패밀리네이티브 지원이 없는 언어에 시리얼라이제이션 지원을 추가하는 라이브러리도 있습니다.

C 및 C++
C와 C++는 어떤 종류의 높은 수준의 구성으로서 직렬화를 제공하지 않지만, 두 언어 모두 기본 제공 데이터 유형뿐만 아니라 일반 데이터 구조도 이진 데이터로 쓸 수 있습니다.따라서 보통 커스텀시리얼라이제이션 함수를 쓰는 것은 간단하다.게다가 C++ 용 ODB ORM 시스템이나 C 및 C++ 용 gSOAP 툴킷등의 컴파일러 베이스의 솔루션은, 클래스 선언을 거의 또는 전혀 수정하지 않고, 자동적으로 시리얼라이제이션 코드를 작성할 수 있습니다.기타 일반적인 시리얼라이제이션 프레임워크는 Boost입니다.Boost Framework, S11n [8]Framework 및 [9]시리얼로부터의 시리얼화[7].MFC 프레임워크(Microsoft)는 Document-View 아키텍처의 일부로서 시리얼라이제이션 방법론도 제공하고 있습니다.
CFML
CFML을 사용하면 데이터 구조를 WDDX로 시리얼화할 수 있습니다.<cfwddx>Serialize JSON() 함수를 사용하여 JSON에 태그를 지정합니다.
델파이
Delphi는 컴포넌트(영속 객체라고도 함)의 시리얼화를 위한 빌트인 메커니즘을 제공하고 있으며 IDE와 완전히 통합되어 있습니다.컴포넌트의 내용은 DFM 파일에 저장되어 즉시 새로고침됩니다.
가세요
Go는 기본적으로 JSON [10]XML 데이터의 Unmarshalling/marshalling을 지원합니다.YAML[11]Protocol Buffer를 지원하는 [12]서드파티 모듈도 있습니다.Go는 [13]Gobs도 지원합니다.
하스켈
Haskell에서는 Read 및 Show 유형 클래스의 멤버인 유형에 대해 직렬화가 지원됩니다.의 멤버인 모든 타입Readtype class는 덤프된 데이터의 문자열 표현에서 데이터를 추출하는 함수를 정의합니다.Showtype class에는 다음 명령어가 포함됩니다.show객체의 문자열 표현을 생성할 수 있는 함수입니다.프로그래머는 함수를 명시적으로 정의할 필요가 없습니다.단순히 타입을 Read 또는 Show, 또는 둘 다로 선언하면 컴파일러가 많은 경우에 적절한 함수를 생성할 수 있습니다(예를 들어, 함수 타입은 Show 또는 Read를 자동으로 도출할 수 없습니다).Show용으로 자동 생성된 인스턴스에서도 유효한 소스 코드가 생성되므로 예를 들어 Haskell [14]인터프리터 등의 show in에서 생성된 코드를 실행함으로써 동일한 Haskell 값을 생성할 수 있습니다.보다 효율적인 직렬화를 위해 이진 형식(예: 이진 형식)에서 고속 직렬화를 허용하는 해스켈 라이브러리가 있습니다.
자바
Java는 자동 시리얼라이제이션 기능을 제공합니다.이것에 의해, 오브젝트에 마크를 붙일 필요가 있습니다.java.io.Serializable 인터페이스입니다.인터페이스를 실장하면, 클래스는 「시리얼라이즈 할 수 있다」라고 마크 되고 나서, Java 는 내부적으로 시리얼라이즈를 처리합니다.에 정의된 시리얼화 방법이 없습니다.Serializableserializable 클래스는 serialization/deserialization 프로세스의 일부로 호출되는 특정 특수 이름과 시그니처를 가진 메서드를 선택적으로 정의할 수 있습니다.또, 이 언어를 사용하면, 개발자는, 다른 인터페이스, 즉, 를 실장하는 것으로써, 시리얼라이제이션 프로세스를 실장하는 것으로써, serialization 프로세스를 보다 완전하게 덮어쓸 수 있습니다.Externalizableinterface에는 오브젝트 상태를 저장 및 복원하는 데 사용되는 두 가지 특별한 방법이 포함되어 있습니다.
기본적으로는 오브젝트를 시리얼화할 수 없는 주된 이유는 세 가지이며, 이 오브젝트를 실장할 필요가 있습니다.Serializable인터페이스를 사용하여 Java의 시리얼화 메커니즘에 액세스합니다.
첫째, 모든 객체가 시리얼화된 상태에서 유용한 의미를 포착하는 것은 아닙니다.예를 들어,Thread오브젝트가 현재 JVM 상태에 연결되어 있습니다.디시리얼라이즈된 컨텍스트는 없습니다.Thread오브젝트는 유용한 의미를 유지합니다.
둘째, 개체의 직렬화된 상태는 클래스의 호환성 계약의 일부를 구성합니다.시리얼 가능한 클래스 버전 간의 호환성을 유지하기 위해서는 추가적인 노력과 고려가 필요합니다.따라서 클래스를 직렬화할 수 있는 상태로 만드는 것은 기본 조건이 아닌 신중한 설계 결정이어야 합니다.
마지막으로 시리얼라이제이션에서는 클래스 내의 비과도한 프라이빗멤버에 대한 액세스가 허용됩니다.이러한 프라이빗멤버는, 그 이외에는 액세스 할 수 없습니다.기밀 정보(패스워드 등)를 포함한 클래스는 시리얼화하거나 외부화할 수 없습니다.표준 인코딩 메서드는 개체의 클래스 설명자 및 직렬 가능한 필드를 바이트 스트림으로 재귀적 그래프 기반 변환합니다.원시 개체와 비순이성, 비정적 참조 개체가 스트림에 인코딩됩니다.다음과 같이 표시되지 않은 필드를 통해 직렬화된 개체에 의해 참조되는 각 개체transient또한 시리얼화해야 합니다.또, 비실행 오브젝트 참조의 완전한 그래프에 있는 오브젝트가 시리얼화할 수 없는 경우 시리얼화는 실패합니다.개발자는 개체를 임시로 표시하거나 참조 그래프의 일부가 잘리고 직렬화되지 않도록 개체의 직렬화를 재정의하여 이 동작에 영향을 줄 수 있습니다.
Java는 생성자를 사용하여 개체를 직렬화하지 않습니다.Java 오브젝트는 JDBC를 통해 시리얼화하여 데이터베이스에 [15]저장할 수 있습니다.Swing 컴포넌트는 시리얼 가능한 인터페이스를 구현하지만 Java Virtual Machine의 다른 버전 간에 이식할 수 있다는 보장은 없습니다.따라서 Swing 컴포넌트 또는 그 컴포넌트를 상속하는 컴포넌트는 바이트 스트림에 시리얼화할 수 있지만 이것이 다른 머신에서 재구성될 수 있다는 보장은 없습니다.
자바스크립트
ECMAScript 5.1 [16]이후 JavaScript에는JSON오브젝트 및 그 방법JSON.parse()그리고.JSON.stringify() JSON은 원래 JavaScript의 [17]서브셋을 기반으로 하지만 JSON이 유효하지 않은 경우가 있습니다.특히 JSON에서는 Unicode터미네이터 U+2028 LINE SEPARATOR 및 U+2029 CLARG SEPARATOR를 따옴표로 묶은 문자열에 이스케이프 없이 표시할 수 있습니다.ECMAScript 2018 이후에는 표시되지 않습니다.[18][19]JSON의 주요 기사를 참조하십시오.
줄리아.
Julia는 다음을 통해 직렬화를 구현합니다.serialize()/deserialize()동일한 버전의 Julia 및/[21]또는 동일한 시스템이미지 인스턴스에서 동작하도록 설계된 [20]모듈입니다.HDF5.jlpackage는 다른 언어용 [22]래퍼가 있는 문서화된 형식과 공통 라이브러리를 사용하여 보다 안정적인 대안을 제공합니다.단, 디폴트시리얼라이제이션 포맷은 네트워크 통신에 최대한의 퍼포먼스를 [23]염두에 두고 설계되어 있는 것이 좋습니다.
리스프
일반적으로 Lisp 데이터 구조는 함수를 사용하여 시리얼화할 수 있습니다.read" 및 "print". 예를 들어 어레이 목록을 포함하는 변수 foo는 다음과 같이 인쇄됩니다.(print foo)마찬가지로 오브젝트는 s라는 이름의 스트림에서 읽을 수 있습니다.(read s)Lisp 실장에서는, 이러한 2개의 부분을 프린터와 리더라고 부릅니다."의 출력print"는 사람이 읽을 수 있습니다. 괄호로 구분된 목록을 사용합니다.다음은 예를 제시하겠습니다.(4 2.9 "x" y). Common Lisp를 포함한 많은 유형의 Lisp에서 프린터는 모든 유형의 데이터를 표시할 수 없습니다.그 이유는 프린터 사용 방법이 명확하지 않기 때문입니다.예를 들어 Common Lisp에서는 프린터가 CLOS 오브젝트를 인쇄할 수 없습니다.대신 프로그래머는 일반 함수에 메서드를 쓸 수 있다.print-object오브젝트가 인쇄될 때 호출됩니다.이것은 Ruby에서 사용하는 방법과 다소 유사합니다.리스프 코드 자체는 읽기 구문이라고 하는 리더의 구문으로 작성됩니다.대부분의 언어는 코드와 데이터를 처리하기 위해 별도의 파서를 사용합니다.Lisp는 1개별 파서는 1개뿐입니다.리스프 코드를 포함한 파일은, 데이터 구조로서 메모리에 읽어 들여져 다른 프로그램에 의해서 변환된 후, 판독 평가 인쇄 루프와 같이 실행 또는 기입할 수 있다.모든 리더/라이터가 순환, 재귀 또는 공유 구조를 지원하는 것은 아닙니다.
.NET 프레임워크
.NET Framework에는 Microsoft가 설계한 몇 가지 시리얼라이저가 있습니다.서드파티에 의한 시리얼라이저도 많이 있습니다.여기서는 [24]12개 이상의 시리얼라이저가 논의되고 테스트되고 있습니다.[25] 리스트는 계속 증가하고 있습니다.
OCaml
OCaml의 표준 라이브러리는 다음을 통해Marshal모듈[3] 및 Pervasive 함수output_value그리고.input_valueOCaml 프로그래밍이 정적으로 타입 체크되는 동안,Marshalmarshaled 스트림이 예상된 유형의 개체를 나타내는지 여부를 확인할 수 없기 때문에 모듈의 유형 보증이 깨질 수 있습니다.OCaml에서는 함수(예를 들어 메서드를 포함하는 객체)를 포함하는 함수 또는 데이터 구조를 정리하는 것이 어려운데, 이는 함수 내의 실행 가능한 코드가 서로 다른 프로그램 간에 전송될 수 없기 때문이다.(함수의 코드 위치를 정렬하는 플래그가 있지만 정확히 동일한 프로그램에서만 마샬링을 해제할 수 있습니다.)표준 마샬링 함수는 공유를 유지하고 플래그로 구성할 수 있는 주기적 데이터를 처리할 수 있습니다.
CPAN에서 사용할 수 있는 여러 Perl 모듈은 다음과 같은 시리얼화 메커니즘을 제공합니다.Storable,JSON::XS그리고.FreezeThaw. Storable에는 파일 또는 Perl 스칼라와의 Perl 데이터 구조를 시리얼화 및 역직렬화하는 기능이 포함되어 있습니다.파일에 직접 일련화할 뿐만 아니라Storable를 포함합니다.freeze스칼라로 패킹된 데이터의 시리얼화된 복사본을 반환하는 함수.thaw그런 스칼라를 역직렬화 할 수 있습니다.이는 네트워크 소켓을 통해 복잡한 데이터 구조를 전송하거나 데이터베이스에 저장하는 데 유용합니다.구조물을 직렬화할 때Storable어떤 컴퓨터에서도 적은 비용으로 읽을 수 있는 형식으로 데이터를 저장하는 네트워크 세이프 기능이 있습니다.이러한 함수는 다음과 같이 지정됩니다.nstore,nfreeze, 등. 이러한 구조를 역직렬화하기 위한 "n" 함수는 없습니다.정규적으로는thaw그리고.retrieve"와 함께 직렬화된 구조물을 역직렬화합니다.n" 기능 및 그 기계 고유의 동등한 기능.
PHP
PHP는 원래 빌트인을 통해 직렬화를 구현했습니다.serialize()그리고.unserialize()기능하고 있습니다.[26]PHP는 리소스(파일 포인터, 소켓 등)를 제외한 모든 데이터 유형을 직렬화할 수 있습니다.빌트인unserialize()함수를 완전히 신뢰할 수 없는 데이터에 [27]사용할 경우 위험합니다.오브젝트의 경우 클래스 내에서 구현할 수 있는2개의 "매직 메서드"가 있습니다.__sleep()그리고.__wakeup()- 내부로부터 호출됩니다.serialize()그리고.unserialize()오브젝트를 정리하고 복원할 수 있습니다.예를 들어 시리얼라이제이션 시 데이터베이스 접속을 닫고 시리얼라이제이션 시 접속을 복원하는 것이 바람직할 수 있습니다.이 기능은 이들2가지 매직방식으로 처리됩니다.또한 개체가 직렬화할 속성을 선택할 수도 있습니다.PHP 5.1 이후, 오브젝트에 대한 객체 지향 시리얼화 메커니즘이 있습니다.Serializable인터페이스입니다.[28]
프롤로그
Prolog용어 구조는 언어의 유일한 데이터 구조이며 내장된 술어를 통해 직렬화할 수 있습니다.write_term/3삽입 술어를 통해 시리얼화됩니다.read/1그리고.read_term/2. 결과 스트림은 압축되지 않은 텍스트(타깃 스트림 구성에 따라 결정되는 일부 인코딩)로, 용어 내의 자유 변수는 플레이스 홀더 변수 이름으로 표시됩니다.술어write_term/3는, 「프로로그의 ISO 사양」(ISO/IEC 13211-1)(59 페이지) ff.("용어 기입, § 7.10.5")에 표준화되어 있습니다.따라서 어떤 구현에 의해 직렬화된 용어는 모호함이나 놀라움 없이 다른 구현에 의해 직렬화될 수 있습니다.실제로 구현별 확장(SWI-Prolog 사전 등)은 비표준 용어 구조를 사용할 수 있으므로 엣지 케이스에서 상호 운용성이 손상될 수 있습니다.예로서 SWI-Prolog,[29] SICStus Prolog,[30][31] GNU Prolog의 대응 매뉴얼페이지를 참조해 주세요.네트워크상에서 수신된 시리얼화된 용어가 사양과 대조되는지 여부 및 방법은 (문자 스트림으로부터의 시리얼화를 해제한 후) 실장자에게 맡겨집니다.프롤로그의 빌트인 확정절 그래머는 이 단계에서 적용할 수 있습니다.
파이썬
일반적인 시리얼라이제이션메커니즘은pickle 표준 라이브러리 모듈: 데이터 시리얼화를 설명하기 위한 데이터베이스 시스템 용어[32][33][34] 피클링을 암시합니다(디시리얼라이징을 위한 비교).피클은 개체를 재구성하는 데 사용된 지침을 기록하는 단순한 스택 기반 가상 시스템을 사용합니다.크로스 버전 커스터마이즈 가능하지만 안전하지 않은(오류 또는 악의적인 데이터로부터 안전하지 않은) 시리얼화 형식입니다.데이터 형식이 잘못되었거나 악의적으로 구성된 경우 역직렬라이저가 임의 모듈을 가져오고 개체를 [35][36]인스턴스화할 수 있습니다.표준 라이브러리에는 표준 데이터 형식으로 직렬화하는 모듈도 포함되어 있습니다.json(기본 스칼라 타입과 수집 타입을 기본으로 지원하며 부호화디코딩 후크를 통해 임의의 타입을 지원할 수 있습니다). plistlib(바이너리 및 XML 속성 목록 형식을 모두 지원합니다). xdrlib(RFC 1014에 기재된 외부 데이터 표현(XDR) 표준을 지원합니다).마지막으로, 오브젝트는,__repr__적절한 환경에서 평가할 수 있기 때문에 일반적인 리스프와는 비교하기 어렵다.print-object모든 오브젝트 타입, 특히 파일 핸들 운영체제리소스를 보유하는 오브젝트 타입을 자동으로 절임할 수 있는 것은 아닙니다.다만, 커스텀의 「축소」와 구축 함수를 등록해, 임의의 타입의 절임과 해제를 서포트할 수 있습니다.피클은 원래 순수한 파이썬으로 구현되었습니다.pickle단, 3.0 이전 버전의 Python에서는cPickle모듈(또한 내장)을 사용하면 퍼포먼스가 향상됩니다(최대 1000배[35] 고속).cPickle비적재 스왈로우 프로젝트에서 각색한 것입니다.Python 3에서 사용자는 항상 표준 버전을 Import해야 합니다. 표준 버전은 가속 버전을 Import하고 Python [37]버전으로 폴백합니다.
R
R은 기능을 가지고 있다.dputR 객체의 ASCII 텍스트 표현을 파일 또는 연결에 씁니다.표현은 다음 방법으로 파일에서 읽을 수 있습니다.dget좀 더 구체적으로 말하면,[38] 기능serialize는 R 오브젝트를 접속에 시리얼화합니다.출력은 16진 형식으로 코드화된 원시 벡터입니다.unserialize함수는 연결 또는 원시 [39]벡터에서 객체를 읽을 수 있도록 합니다.
리볼
REBOL은 파일에 시리얼화됩니다(save/all) 또는 에 대해서string!(mold/all) 문자열과 파일은 폴리모픽을 사용하여 역직렬화할 수 있습니다. load기능. RProtoBufProtocol [40]Buffers를 사용한R 언어 간 데이터시리얼라이제이션입니다
루비
Ruby에는 표준 모듈이 포함되어 있습니다.Marshal2가지 방법으로dump그리고.load(표준 Unix 유틸리티와 유사)dump그리고.restore이러한 메서드는 표준 클래스에 시리얼화됩니다.String즉, 사실상 바이트 시퀀스가 됩니다.일부 개체를 직렬화할 수 없습니다(일부 개체를 직렬화하면TypeError예외): 바인딩, 프로시저 오브젝트, 클래스 IO 인스턴스, 싱글톤 오브젝트 및 인터페이스.클래스에서 커스텀시리얼라이제이션이 필요한 경우(예를 들어 덤프/복원 시 특정 클린업액션이 필요한 경우)는 다음 2가지 방법을 구현하여 실행할 수 있습니다._dump그리고._load인스턴스 방식_dumpa를 반환해야 합니다.String이 클래스의 개체와 참조되는 모든 개체를 정수 매개 변수로 지정된 최대 깊이까지 재구성하는 데 필요한 모든 정보를 포함하는 개체입니다(-1 값은 깊이 검사를 비활성화해야 함을 의미함).클래스 방식_load을 가져가야 한다String이 클래스의 개체를 반환합니다.
Serde는 Rust에서 시리얼화에 가장 널리 사용되는 라이브러리(상자)입니다.
스몰토크
일반적으로 비재귀 및 비공유 객체는 다음을 사용하여 사람이 읽을 수 있는 형태로 저장 및 검색할 수 있습니다.storeOn:/readFrom:프로토콜입니다.storeOn:method는 Smalltalk 식의 텍스트를 생성합니다.이 문자는 평가 시 다음과 같습니다.readFrom:- 원래 개체를 다시 만듭니다.이 방식은 데이터 자체가 아니라 개체의 절차적 설명을 사용한다는 점에서 특별합니다.따라서 매우 유연하기 때문에 클래스가 보다 콤팩트한 표현을 정의할 수 있습니다.그러나 원래 형태에서는 순환 데이터 구조를 처리하거나 공유 참조의 정체성을 보존하지 않습니다(즉, 단일 개체가 동일하지만 동일한 복사본이 아닌 두 개의 참조로 복원됩니다).이를 위해 다양한 휴대용 및 비휴대용 대체품이 있습니다.그 중 일부는 특정 Smalltalk 구현 또는 클래스 라이브러리에 고유합니다.Squak Smalltalk에서는 개체를 직렬화하고 저장하는 여러 가지 방법이 있습니다.가장 쉽고 가장 많이 사용하는 것은storeOn:/readFrom:및 바이너리 스토리지 포맷을 기반으로SmartRefStream시리얼라이저또한 번들 개체는 다음 방법으로 저장 및 검색할 수 있습니다.ImageSegments둘 다 컴팩트한 바이너리 형식으로의 시리얼화와 취득을 지원하는 이른바 바이너리 오브젝트 스토리지 프레임워크를 제공합니다.둘 다 순환, 재귀 및 공유 구조, 클래스 및 메타클래스 정보의 저장/검색 및 "온 더 플라이" 객체 마이그레이션 메커니즘을 포함합니다(즉, 이전 버전의 클래스에서 작성된 인스턴스를 다른 객체 레이아웃으로 변환합니다).API는 비슷하지만(storeBinary/readBinary), 부호화의 상세 내용이 다르기 때문에 이 두 형식은 호환되지 않습니다.단, Smalltalk/X 코드는 오픈소스로 무료이며 다른 Smalltalk에 로드하여 상호변역 객체 교환이 가능합니다.오브젝트 시리얼화는 ANSI Smalltalk 사양의 일부가 아닙니다.그 결과 오브젝트를 시리얼화하는 코드는 Smalltalk 구현에 따라 달라집니다.결과 이진 데이터도 다양합니다.예를 들어 Squak Smalltalk에서 생성된 직렬화된 개체는 Ambrai Smalltalk에서 복원할 수 없습니다.따라서 객체시리얼라이제이션에 의존하는 여러 Smalltalk 구현에서 동작하는 다양한 애플리케이션은 이러한 다른 구현 간에 데이터를 공유할 수 없습니다.이러한 응용 프로그램에는 MineStore 개체[41] 데이터베이스와 일부 RPC 패키지가 포함됩니다.이 문제의 해결방법은 [42]SIXX입니다.SIXX는 시리얼화에 XML 기반 형식을 사용하는 여러 Smalltalk용 패키지입니다.
재빠르다
Swift 표준 라이브러리는 두 가지 프로토콜을 제공합니다.Encodable그리고.Decodable(로서 합친 것)Codable를 사용하면, JSON, 속성 리스트, 또는 그 외의 형식에 [43]준거한 타입의 인스턴스를 시리얼화 또는 역시리얼화할 수 있습니다.이러한 프로토콜의 기본 구현은 또한 저장된 속성이 다음과 같은 유형에 대해 컴파일러에 의해 생성될 수 있습니다.Decodable또는Encodable.
Windows PowerShell
Windows PowerShell은 내장된 cmdlet을 통해 시리얼화를 구현합니다.Export-CliXML.Export-CliXML는 시리얼화 됩니다.NET 는, 결과 XML 를 오브젝트 해 파일에 보존합니다.개체를 재구성하려면Import-CliXMLcmdlet - 내보낸 파일의 XML에서 역직렬화된 개체를 생성합니다."속성 가방"이라고도 하는 역직렬화 개체는 활성 개체가 아닙니다. 속성은 있지만 메서드는 없습니다.내장 cmdlet을 사용하여 CSV 형식으로 2차원 데이터 구조를 시리얼화(탈시리얼화)할 수도 있습니다.Import-CSV그리고.Export-CSV.

「 」를 참조해 주세요.

레퍼런스

  1. ^ Cline, Marshall. "C++ FAQ: "What's This "Serialization" Thing All About?"". Archived from the original on 2015-04-05. It lets you take an object or group of objects, put them on a disk or send them through a wire or wireless transport mechanism, then later, perhaps on another computer, reverse the process, resurrecting the original object(s). The basic mechanisms are to flatten object(s) into a one-dimensional stream of bits, and to turn that stream of bits back into the original object(s).
  2. ^ "Module: Marshal (Ruby 3.0.2)". ruby-doc.org. Retrieved 25 July 2021.
  3. ^ a b "Marshal". OCaml. Retrieved 25 July 2021.
  4. ^ "Python 3.9.6 documentation - Python object serialization —pickle". Documentation - The Python Standard Library.
  5. ^ S. Miller, Mark. "Safe Serialization Under Mutual Suspicion". ERights.org. Serialization, explained below, is an example of a tool for use by objects within an object system for operating on the graph they are embedded in. This seems to require violating the encapsulation provided by the pure object model.
  6. ^ Sun Microsystems (1987). "XDR: External Data Representation Standard". RFC 1014. Network Working Group. Retrieved July 11, 2011.
  7. ^ "Serialization". www.boost.org.
  8. ^ beal, stephan. "s11n.net: object serialization/persistence in C++". s11n.net.
  9. ^ "cereal Docs - Main". uscilab.github.io.
  10. ^ "Package encoding". pkg.go.dev. 12 July 2021.
  11. ^ "GitHub - YAML support for the Go language". GitHub. Retrieved 25 July 2021.
  12. ^ "proto · pkg.go.dev". pkg.go.dev. Retrieved 2021-06-22.
  13. ^ "gob package - encoding/gob - pkg.go.dev". pkg.go.dev. Retrieved 2022-03-04.
  14. ^ "Text.Show Documentation". Retrieved 15 January 2014.
  15. ^ "Ask TOM "Serializing Java Objects into the database (and ge..."". asktom.oracle.com.
  16. ^ "JSON". MDN Web Docs. Retrieved 22 March 2018.
  17. ^ "JSON". www.json.org. Retrieved 22 March 2018.
  18. ^ Holm, Magnus (15 May 2011). "JSON: The JavaScript subset that isn't". The timeless repository. Retrieved 23 September 2016.
  19. ^ "TC39 Proposal: Subsume JSON". ECMA TC39 committee. 22 May 2018.
  20. ^ "Serialization". The Julia Language. Retrieved 25 July 2021.
  21. ^ "faster and more compact serialization of symbols and strings · JuliaLang/julia@bb67ff2". GitHub.
  22. ^ "HDF5.jl: Saving and loading data in the HDF5 file format". 20 August 2017 – via GitHub.
  23. ^ "Julia: how stable are serialize() / deserialize()". stackoverflow.com. 2014.
  24. ^ ".NET Serializers". There are many kinds of serializers; they produce very compact data very fast. There are serializers for messaging, for data stores, for marshaling objects. What is the best serializer in .NET?
  25. ^ "SERBENCH by aumcode". aumcode.github.io.
  26. ^ "PHP: Object Serialization - Manual". ca.php.net.
  27. ^ Esser, Stephen (2009-11-28). "Shocking News in PHP Exploitation". Suspekt... Archived from the original on 2012-01-06.
  28. ^ "PHP: Serializable - Manual". www.php.net.
  29. ^ ""Term reading and writing"". www.swi-prolog.org.
  30. ^ ""write_term/[2,3]"". sicstus.sics.se.
  31. ^ ""Term input/output"". gprolog.org.
  32. ^ Herlihy, Maurice; Liskov, Barbara (October 1982). "A Value Transmission Method for Abstract Data Types" (PDF). ACM Transactions on Programming Languages and Systems. 4 (4): 527–551. CiteSeerX 10.1.1.87.5301. doi:10.1145/69622.357182. ISSN 0164-0925. OCLC 67989840. S2CID 8126961.
  33. ^ Birrell, Andrew; Jones, Mike; Wobber, Ted (November 1987). "A Simple and Efficient Implementation for Small Databases". ACM SIGOPS Operating Systems Review: Proceedings of the 11th ACM Symposium on Operating System Principles. 11 (5): 149–154. CiteSeerX 10.1.1.100.1457. doi:10.1145/41457.37517. ISSN 0163-5980. OCLC 476062921. S2CID 12908261. Our implementation makes use of a mechanism called “pickles”, which will convert between any strongly typed data structure and a representation of that structure suitable for storing in permanent disk files. The operation Pickle.Write takes a pointer to a strongly typed data structure and delivers buffers of bits for writing to the disk. Conversely Pickle.Read reads buffers of bits from the disk and delivers a copy of the original data structure.(*) This conversion involves identifying the occurrences of addresses in the structure, and arranging that when the structure is read back from disk the addresses are replaced with addresses valid in the current execution environment. The pickle mechanism is entirely automatic: it is driven by the run-time typing structures that are present for our garbage collection mechanism. ... (*) Pickling is quite similar to the concept of marshalling in remote procedure calls. But in fact our pickling implementation works only by interpreting at run-time the structure of dynamically typed values, while our RPC implementation works only by generating code for the marshalling of statically typed values. Each facility would benefit from adding the mechanisms of the other, but that has not yet been done.
  34. ^ van Rossum, Guido (1 December 1994). "Flattening Python Objects". Python Programming Language – Legacy Website. Delaware, United States: Python Software Foundation. Retrieved 6 April 2017. Origin of the name 'flattening': Because I want to leave the original 'marshal' module alone, and Jim complained that 'serialization' also means something totally different that's actually relevant in the context of concurrent access to persistent objects, I'll use the term 'flattening' from now on. ... (The Modula-3 system uses the term 'pickled' data for this concept. They have probably solved all problems already, and in a type-safe manner :-)
  35. ^ a b "11.1. pickle — Python object serialization — Python 2.7.14rc1 documentation". docs.python.org.
  36. ^ "pickle — Python object serialization — Python v3.0.1 documentation". docs.python.org.
  37. ^ "What's New In Python 3.0 — Python v3.1.5 documentation". docs.python.org.
  38. ^ [R 매뉴얼 http://stat.ethz.ch/R-manual/R-patched/library/base/html/dput.html]
  39. ^ [R 매뉴얼 http://stat.ethz.ch/R-manual/R-patched/library/base/html/serialize.html]
  40. ^ Eddelbuettel, Dirk; Stokely, Murray; Ooms, Jeroen (2014). "RProtoBuf: Efficient Cross-Language Data Serialization in R". Journal of Statistical Software. 71 (2). arXiv:1401.7372. doi:10.18637/jss.v071.i02. S2CID 36239952.
  41. ^ "MinneStore version 2". SourceForge. Archived from the original on 11 May 2005.
  42. ^ "What's new". SIXX - Smalltalk Instance eXchange in XML. 23 January 2010. Retrieved 25 July 2021.
  43. ^ "Swift Archival & Serialization". www.github.com. 2018-12-02.

외부 링크