
コンピューティングにおいて、シリアライゼーション(またはシリアライゼーション、 Pythonではpicklingとも呼ばれる)とは、データ構造またはオブジェクトの状態を、保存(二次記憶装置内のファイル、一次記憶装置内のデータ バッファなど)または送信(コンピュータ ネットワーク上のデータストリームなど)して後で再構築(場合によっては別のコンピュータ 環境)できる形式に変換するプロセスです。 [ 1 ]結果として得られた一連のビットをシリアライゼーション 形式に従って読み直すと、元のオブジェクトと意味的に同一のクローンを作成するために使用できます。参照を多用するオブジェクトなど、多くの複雑なオブジェクトの場合、このプロセスは単純ではありません。オブジェクトのシリアライゼーションには、以前にリンクされていた関連メソッドは含まれません。
オブジェクトをシリアル化するこのプロセスは、状況によってはマーシャリングとも呼ばれます。 [ 2 ] [ 3 ] [ 4 ]反対の操作、つまり一連のバイトからデータ構造を抽出する操作は、デシリアライゼーション(アンシリアライゼーションまたはアンマーシャリングとも呼ばれます)です。
ネットワーク機器のハードウェアにおいて、シリアル化とデシリアル化を担当する部分は、一般的にSerDesと呼ばれます。
シリアライゼーションの用途には以下のようなものがあります。
これらの機能の一部が有用であるためには、アーキテクチャの独立性を維持する必要があります。たとえば、分散処理を最大限に活用するには、異なるハードウェアアーキテクチャで動作するコンピュータが、エンディアンに関係なく、シリアル化されたデータストリームを確実に再構築できる必要があります。これは、データ構造のメモリレイアウトを直接コピーするという、より単純で高速な手順が、すべてのアーキテクチャで確実に機能するとは限らないことを意味します。データ構造をアーキテクチャに依存しない形式でシリアル化することで、バイト順序、メモリレイアウト、あるいは単に異なるプログラミング言語でのデータ構造の表現方法の違いといった問題を回避できます。
あらゆるシリアル化方式に共通する性質として、データのエンコードは定義上シリアルであるため、シリアル化されたデータ構造の一部を抽出するには、オブジェクト全体を最初から最後まで読み込み、再構築する必要があります。多くのアプリケーションでは、この線形性は利点となります。なぜなら、オブジェクトの状態を保持および伝達するために、シンプルで一般的な入出力インターフェースを利用できるからです。しかし、より高いパフォーマンスが求められるアプリケーションでは、より複雑な非線形ストレージ構成に対応するために、より多くの労力を費やすことが理にかなっている場合もあります。
単一のマシン上であっても、プリミティブなポインタオブジェクトは、それが指すオブジェクトがメモリ内の別の場所に再ロードされる可能性があるため、保存するには脆弱すぎます。この問題を解決するために、シリアライゼーション処理には、直接ポインタ参照を名前または位置に基づく参照に変換する「アンスウィズリング」または「ポインタアンスウィズリング」と呼ばれるステップが含まれています。デシリアライゼーション処理には、これとは逆の「ポインタスウィズリング」と呼ばれるステップが含まれています。
シリアル化と逆シリアル化はどちらも共通コード(例えば、Microsoft Foundation ClassesのSerialize関数)から実行できるため、共通コードで両方を同時に実行し、1) シリアル化中のオブジェクトとその以前のコピーとの差異を検出し、2) 次の差異検出のための入力を提供することが可能です。差異は実行時に検出できるため、以前のコピーを実際に作成する必要はありません。この手法は差分実行と呼ばれます。これは、コンテンツが時間とともに変化するユーザー インターフェイスのプログラミングに役立ちます。グラフィカル オブジェクトを作成、削除、変更したり、入力イベントを処理するように設定したりする際に、これらの処理を行うためのコードを別途記述する必要がありません。
シリアライゼーションは、潜在的にプライベートな実装の詳細を公開することで、抽象データ型の不透明性を損ないます。すべてのデータメンバーをシリアライズする単純な実装は、カプセル化に違反する可能性があります。[ 5 ]
競合他社が互換性のある製品を開発するのを阻止するため、独自ソフトウェアの発行元は、プログラムのシリアル化フォーマットの詳細を企業秘密として保持することが多い。中には、シリアル化されたデータを意図的に難読化したり、暗号化したりする企業もある。しかし、相互運用性を実現するには、アプリケーションが互いのシリアル化フォーマットを理解できることが不可欠である。そのため、CORBAのようなリモートメソッド呼び出しアーキテクチャは、シリアル化フォーマットを詳細に定義している。
公文書館や図書館など、多くの機関は、バックアップアーカイブ、特にデータベースのダンプを、比較的人間が読みやすいシリアル化された形式で保存することで、将来にわたってその状態を維持しようと試みている。
1980年代初頭のゼロックス・ネットワーク・システムズのクーリエ技術は、広く採用された最初の標準に影響を与えました。サン・マイクロシステムズは1987年に外部データ表現(XDR)を発表しました。 [ 6 ] XDRはオープンフォーマットであり、IETFによってSTD 67(RFC 4506)として標準化されました。
1990年代後半、標準的なシリアル化プロトコルに代わるものを提供しようとする動きが始まりました。SGMLのサブセットであるXMLは、人間が読みやすいテキストベースのエンコーディングを生成するために使用されました。このようなエンコーディングは、プログラミング言語に関係なく、人間が読み取って理解したり、他のシステムに伝達したりできる永続的なオブジェクトに役立ちます。よりコンパクトなバイトストリームベースのエンコーディングを失うという欠点がありますが、この時点ではストレージと伝送容量が大きくなったため、ファイルサイズはコンピューティングの初期の頃ほど問題にならなくなりました。2000年代には、XMLはAjax Webアプリケーションでクライアントとサーバー間で構造化データを非同期転送するためによく使用されました。XMLはオープンフォーマットであり、W3C勧告として標準化されています。
JSONは、XMLに代わる軽量なプレーンテキスト形式であり、Webアプリケーションにおけるクライアント・サーバー間の通信によく用いられます。JSONはJavaScriptの構文に基づいていますが、JavaScriptとは独立しており、他の多くのプログラミング言語でもサポートされています。JSONは、 STD 90(RFC 8259)、ECMA-404、およびISO/IEC 21778:2017として標準化されています。
YAMLはJSONの厳密な上位互換であり、データ型タグ、循環データ構造のサポート、インデントに依存する構文、複数の形式のスカラーデータ引用符など、追加機能を備えています。YAMLはオープンフォーマットです。
プロパティリストは、 NeXTSTEP、GNUstep、macOS、およびiOSフレームワークによるシリアル化に使用されます。プロパティリスト(略してp-list)は、単一のシリアル化フォーマットを指すのではなく、人間が読める形式とバイナリ形式など、いくつかの異なる形式を指します。
衛星データや数値気候モデル、気象モデル、海洋モデルの出力など、大容量の科学データセットについては、HDF、netCDF、古いGRIBなどの特定のバイナリシリアル化標準が開発されています。
オブジェクト指向プログラミング言語の多くは、構文糖衣要素を用いるか、あるいは標準インターフェースを提供することで、オブジェクトのシリアライゼーション(またはオブジェクトアーカイブ)を直接サポートしています。こうした言語には、Ruby、Smalltalk、Python、PHP、Objective-C、Delphi、Java、そして.NETファミリーの言語が含まれます。また、ネイティブでシリアライゼーションをサポートしていない言語に、そのサポートを追加するライブラリも存在します。
CとC++ は、高レベルの構造としてシリアライゼーションを提供していませんが、どちらの言語も、組み込みのデータ型や通常のデータ構造体をバイナリ データとして書き込むことをサポートしています。そのため、カスタム シリアライゼーション 関数を作成するのは通常簡単です。さらに、C++ 用の ODB ORMシステムやC および C++ 用のgSOAPツールキットなどのコンパイラ ベースのソリューションは、クラス宣言をほとんどまたはまったく変更することなく、シリアライゼーション コードを自動的に生成できます。その他の一般的なシリアライゼーション フレームワークには、 Boost FrameworkのBoost.Serialization [ 7 ]、S11n フレームワーク[ 8 ] 、および Cereal [ 9 ]があります。MFCフレームワーク(Microsoft) も、ドキュメント ビュー アーキテクチャの一部としてシリアライゼーションの方法論を提供しています。
C++26でリフレクティブ プログラミングが導入されたことで、シリアライゼーションが大幅に簡素化されました。リフレクションにより、例えばJSON を対応する構造を持つデータにコンパイル時にシリアライズすることが可能になりました。[ 10 ]struct
CFMLでは、タグを使用してデータ構造をWDDXにシリアル化し<cfwddx>、SerializeJSON()関数を使用してJSONにシリアル化できます。
Delphiには、コンポーネント(永続オブジェクトとも呼ばれる)をシリアル化するための組み込みメカニズムが用意されており、IDEと完全に統合されています。コンポーネントの内容はDFMファイルに保存され、実行時に自動的に再読み込みされます。
Go はJSONおよびXMLデータのアンマーシャリング/マーシャリングをネイティブにサポートしています。[ 11 ]また、 YAML [ 12 ]およびProtocol Buffers [ 13 ]をサポートするサードパーティ モジュールもあります。GoはGobsもサポートしています。[ 14 ]
Haskell では、Read 型クラスと Show型クラスのメンバーである型に対してシリアライゼーションがサポートされています。型クラスのメンバーであるすべての型は、Readダンプされたデータの文字列表現からデータを抽出する関数を定義します。Show型クラスには、showオブジェクトの文字列表現を生成できる関数が含まれています。プログラマは関数を明示的に定義する必要はありません。型が Read または Show を派生している、あるいはその両方を派生していると宣言するだけで、コンパイラは多くの場合 (ただしすべてではありません。たとえば、関数型は Show または Read を自動的に派生することはできません) 適切な関数を生成できます。Show の自動生成されたインスタンスも有効なソース コードを生成するため、たとえば Haskell インタプリタで show によって生成されたコードを実行することで、同じ Haskell 値を生成できます。[ 15 ]より効率的なシリアライゼーションのために、バイナリ形式での高速シリアライゼーションを可能にする haskell ライブラリがあります。たとえば、 binaryなどです。
Java は自動シリアライゼーションを提供しており、そのためにはオブジェクトがインターフェースを実装してマークする必要があります。インターフェースを実装すると、クラスが「シリアライズ可能」とマークされ、Java が内部的にシリアライゼーションを処理します。インターフェースにはシリアライゼーション メソッドは定義されていませんが、シリアライズ可能なクラスは、特定の特別な名前とシグネチャを持つメソッドをオプションで定義できます。これらのメソッドが定義されている場合、シリアライゼーション/デシリアライゼーション プロセスの一部として呼び出されます。また、この言語では、オブジェクトの状態を保存および復元するために使用される 2 つの特別なメソッドを含む別のインターフェースであるインターフェースを実装することで、開発者がシリアライゼーション プロセスをより徹底的にオーバーライドすることもできます。オブジェクトがデフォルトではシリアライズ可能ではなく、Java のシリアライゼーション メカニズムにアクセスするためにインターフェースを実装する必要がある主な理由は 3 つあります。まず、すべてのオブジェクトがシリアライズされた状態で有用なセマンティクスを捉えるわけではありません。たとえば、オブジェクトは現在のJVMの状態に結び付けられています。デシリアライズされたオブジェクトが有用なセマンティクスを維持するコンテキストはありません。次に、オブジェクトのシリアライズされた状態は、そのクラスの互換性契約の一部を形成します。シリアライズ可能なクラスのバージョン間の互換性を維持するには、追加の労力と検討が必要です。したがって、クラスをシリアライズ可能にすることは、意図的な設計上の決定である必要があり、デフォルトの条件であってはなりません。最後に、シリアライズにより、それ以外の方法ではアクセスできないクラスの非一時的プライベート メンバーにアクセスできるようになります。機密情報 (たとえば、パスワード) を含むクラスは、シリアライズ可能でも外部化可能でもあってはなりません。[ 16 ] : 339–345標準のエンコード方式では、オブジェクトのクラス記述子とシリアライズ可能なフィールドの再帰的なグラフベースの変換を使用して、バイト ストリームに変換します。プリミティブと非一時的、非静的参照オブジェクトは、ストリームにエンコードされます。シリアライズされたオブジェクトによって、としてマークされていないフィールドを介して参照される各オブジェクトもシリアライズする必要があります。非一時的オブジェクト参照の完全なグラフ内のオブジェクトのいずれかがシリアライズ可能でない場合、シリアライズは失敗します。開発者は、オブジェクトを一時オブジェクトとしてマークするか、オブジェクトのシリアライゼーションを再定義して参照グラフの一部を切り捨ててシリアライズしないようにすることで、この動作に影響を与えることができます。Java はコンストラクタを使用してオブジェクトをシリアライズしません。Java オブジェクトはJDBCを介してシリアライズしてデータベースに保存できます。 [ 17 ] Swingでは、java.io.SerializableSerializableExternalizableSerializableThreadThreadtransientコンポーネントはSerializableインターフェースを実装していますが、Java仮想マシンの異なるバージョン間での移植性は保証されていません。そのため、Swingコンポーネント、またはそれを継承するコンポーネントはバイトストリームにシリアル化できますが、別のマシンでそれが再現可能であることは保証されません。
ECMAScript 5.1以降、[ 18 ] JavaScriptには組み込みJSONオブジェクトとそのメソッドJSON.parse()とが含まれていますJSON.stringify()。JSONは元々JavaScriptのサブセットに基づいていますが、[ 19 ] JSONが有効なJavaScriptではない境界ケースがあります。具体的には、JSONでは引用符で囲まれた文字列内でUnicodeの行区切り文字U+2028 LINE SEPARATORとU+2029 PARAGRAPH SEPARATORがエスケープされずに表示されることを許可していますが、ECMAScript 2018以前では許可されていません。[ 20 ] [ 21 ] JSONのメイン記事を参照してください。
Julia はserialize()/モジュールを介してシリアライゼーションを実装しておりdeserialize()、[ 22 ]同じバージョンの Julia 内、または同じシステム イメージのインスタンス内で動作することを想定しています。[ 23 ]パッケージHDF5.jlは、文書化されたフォーマットとさまざまな言語用のラッパーを備えた共通ライブラリを使用することで、より安定した代替手段を提供します。[ 24 ]一方、デフォルトのシリアライゼーション フォーマットは、ネットワーク通信で最大限のパフォーマンスを発揮することを念頭に置いて設計されたと考えられています。[ 25 ]
一般的に、Lisp のデータ構造は、関数 "readとprint" でシリアル化できます。たとえば、配列のリストを含む変数 foo は、 で出力されます(print foo)。同様に、オブジェクトは、 で s という名前のストリームから読み取ることができます(read s)。Lisp 実装のこれら 2 つの部分は、プリンタとリーダーと呼ばれます。 " の出力はprint人間が読める形式です。たとえば、 のように括弧で囲まれたリストを使用します。Common Lispを含む多くのタイプの Lisp では、プリンタはすべてのタイプのデータを表現することはできません。これは、どのように表現すればよいかが明確ではないためです。たとえば、Common Lisp では、プリンタは CLOS オブジェクトを出力できません。代わりに、プログラマは汎用関数 にメソッドを記述できます。これは、オブジェクトが出力されるときに呼び出されます。これは、Ruby で使用されるメソッドと多少似ています。Lisp コード自体は、読み取り構文と呼ばれるリーダーの構文で記述されます。ほとんどの言語は、コードとデータを処理するために別々の異なるパーサーを使用しますが、Lisp は 1 つだけを使用します。 Lispコードを含むファイルは、データ構造としてメモリに読み込まれ、別のプログラムによって変換された後、実行または書き出される可能性があります。例えば、読み込み・評価・出力ループなどがこれに該当します。ただし、すべてのリーダー/ライターが循環構造、再帰構造、または共有構造をサポートしているわけではありません。(42.9"x"y)print-object
.NETには、 Microsoftが設計したシリアライザーがいくつかあります。サードパーティ製のシリアライザーも多数あります。12 種類以上のシリアライザーが、Wayback Machineに 2015 年 5 月 8 日にアーカイブされたこちらの記事[ 26 ]およびこちらの記事[ 27 ]で議論され、テストされています。
OCamlの標準ライブラリは、Marshalモジュール[ 3 ]と Pervasives 関数output_valueおよびを介してマーシャリングを提供しますinput_value。OCaml プログラミングは静的に型チェックされますが、Marshalモジュールの使用は、アンマーシャリングされたストリームが期待される型のオブジェクトを表しているかどうかを確認する方法がないため、型の保証を破る可能性があります。OCaml では、関数または関数を含むデータ構造 (たとえば、メソッドを含むオブジェクト) をマーシャリングするのは困難です。関数内の実行可能コードは、異なるプログラム間で転送できないためです。(関数のコード位置をマーシャリングするためのフラグがありますが、まったく同じプログラム内でのみアンマーシャリングできます)。標準のマーシャリング関数は、共有を維持し、循環データを処理できます。これは、フラグによって構成できます。
CPANから入手できるPerlモジュールのいくつかには、シリアライズ メカニズムが備わっており、、、 などが含まれます。 Storable には、Perl データ構造をファイルまたは Perl スカラーにシリアライズおよびデシリアライズする関数が含まれています。 ファイルに直接シリアライズするだけでなく、 には、スカラーにパックされたデータのシリアライズされたコピーを返す関数と、そのようなスカラーをデシリアライズする関数が含まれています。 これは、複雑なデータ構造をネットワーク ソケット経由で送信したり、データベースに保存したりする場合に役立ちます。 で構造をシリアライズする場合、ネットワーク セーフな関数があり、速度を少し犠牲にするだけで、常にどのコンピュータでも読み取り可能な形式でデータを保存します。 これらの関数は、、 などと名付けられています。 これらの構造をデシリアライズするための「n」関数はありません。通常のおよび は、「」関数とそのマシン固有の同等物でシリアライズされた構造をデシリアライズします。StorableJSON::XSFreezeThawStorablefreezethawStorablenstorenfreeze thawretrieven
PHP は当初、組み込み関数serialize()とunserialize()関数を使用してシリアライゼーションを実装していました。[ 28 ] PHP は、リソース (ファイル ポインタ、ソケットなど) を除くすべてのデータ型をシリアライズできます。組み込み関数は、unserialize()完全に信頼できないデータに使用すると危険な場合がよくあります。[ 29 ]オブジェクトの場合、クラス内に実装できる 2 つの「マジック メソッド」であると があり、それぞれと から呼び出され、オブジェクトをクリーンアップおよび復元できます。たとえば、シリアライズ時にデータベース接続を閉じ、デシリアライズ時に接続を復元することが望ましい場合があります。この機能は、これら 2 つのマジック メソッドで処理されます。また、オブジェクトがどのプロパティをシリアライズするかを選択することもできます。PHP 5.1 以降、オブジェクト用のオブジェクト指向シリアライゼーション メカニズムであるインターフェースがあります。[ 30 ] __sleep()__wakeup() serialize()unserialize()Serializable
Prologの項構造は、この言語の唯一のデータ構造であり、組み込み述語 を介してシリアル化して出力できwrite_term/3、組み込み述語read/1およびを介してシリアル化して入力できますread_term/2。結果として得られるストリームは、圧縮されていないテキスト (ターゲット ストリームの設定によって決定される何らかのエンコーディング) であり、項内の自由変数はプレースホルダー変数名で表されます。述語 は、Prolog の ISO 仕様write_term/3(ISO/IEC 13211-1) の 59 ページ以降 (「項の記述、§ 7.10.5」)で標準化されています。したがって、ある実装によってシリアル化された項は、曖昧さや予期せぬ事態なしに別の実装によってシリアル化して入力できることが期待されます。実際には、実装固有の拡張機能 (たとえば、SWI-Prolog の辞書) は非標準の項構造を使用する可能性があるため、エッジ ケースでは相互運用性が損なわれる可能性があります。例として、SWI-Prolog、[ 31 ] SICStus Prolog、[ 32 ] GNU Prolog の対応するマニュアル ページを参照してください。[ 33 ]ネットワーク経由で受信したシリアライズされた用語が仕様と照合されるかどうか、またどのように照合されるか(文字ストリームからの逆シリアライズが行われた後)は実装者に委ねられています。その段階では、Prolog の組み込みの確定節文法を適用できます。
コアとなる一般的なシリアライゼーション メカニズムはpickle標準ライブラリモジュールであり、データベース システム用語のpickling [ 34 ] [ 35 ] [ 36 ]にちなんで、データのシリアライゼーション (デシリアライゼーションの場合はunpickle ) を説明しています。 Pickle は、オブジェクトを再構築するために使用される命令を記録するシンプルなスタック ベースの仮想マシンを使用します。 これは、クロス バージョンでカスタマイズ可能ですが、安全ではない (誤ったデータや悪意のあるデータに対して安全ではない) シリアライゼーション フォーマットです。 不正な形式または悪意を持って構築されたデータにより、デシリアライザが任意のモジュールをインポートして任意のオブジェクトをインスタンス化する可能性があります。[ 37 ] [ 38 ]標準ライブラリには、標準データ フォーマットにシリアライズするモジュールも含まれています。(基本的なスカラー型とコレクション型の組み込みサポートがあり、エンコードおよびデコード フックを介して任意の型をサポートできます)。 (バイナリ形式と XMLプロパティ リスト形式の両方をサポート)。(RFC 1014 で説明されている外部データ表現 (XDR) 標準をサポート)。最後に、オブジェクトは適切な環境で評価可能であることが推奨されており、Common Lisp の とほぼ一致します。すべてのオブジェクト型が自動的に pickle 化されるわけではありません。特に、ファイル ハンドルなどのオペレーティングシステムリソースを保持するオブジェクトはそうではありませんが、ユーザーはカスタムの「削減」関数と構築関数を登録して、任意の型の pickle 化と unpickle 化をサポートできます。 Pickle は元々純粋な Pythonモジュールとして実装されましたが、Python 3.0 より前のバージョンでは、モジュール (組み込み) によりパフォーマンスが向上しています (最大 1000 倍高速[ 37 ] )。 はUnladen Swallowプロジェクトから採用されました。 Python 3 では、ユーザーは常に標準バージョンをインポートする必要があります。これは、高速化されたバージョンをインポートしようとして、純粋な Python バージョンにフォールバックします。[ 39 ]jsonplistlibxdrlib__repr__print-objectpicklecPicklecPickle
Rdputには、R オブジェクトの ASCII テキスト表現をファイルまたは接続に書き込む関数があります。表現は、を使用してファイルから読み取ることができますdget。[ 40 ]より具体的には、関数はserializeR オブジェクトを接続にシリアル化し、出力は 16 進数形式でコード化された生ベクトルになります。関数を使用するとunserialize、接続または生ベクトルからオブジェクトを読み取ることができます。[ 41 ]
REBOLはファイル ( save/all) またはstring!( ) にシリアル化します。文字列とファイルは、多態mold/all関数を使用して逆シリアル化できます。は、プロトコル バッファを使用して R での言語間データシリアル化を提供します。[ 42 ]loadRProtoBuf
Ruby には、標準の Unix ユーティリティやに似たMarshal2 つのメソッドと を含むdump標準モジュールが含まれています。これらのメソッドは標準クラスにシリアライズされ、実質的にバイト列になります。一部のオブジェクトはシリアライズできません (シリアライズすると例外が発生します)。バインディング、プロシージャ オブジェクト、クラス IO のインスタンス、シングルトン オブジェクト、およびインターフェースです。クラスがカスタム シリアライズを必要とする場合 (たとえば、ダンプ / リストア時に特定のクリーンアップ アクションを実行する必要がある場合)、2 つのメソッドと を実装することで実現できます。インスタンスメソッドは、このクラスのオブジェクトと、整数パラメータとして指定された最大深度までのすべての参照オブジェクトを再構成するために必要なすべての情報を含むオブジェクトを返す必要があります(値が -1 の場合は、深度チェックを無効にする必要があります)。クラス メソッドはを受け取り、このクラスのオブジェクトを返す必要があります。loaddumprestoreStringTypeError_dump_load_dumpString_loadString

Pointを実装しています。SerializeDeserializeSerdeは、 Rustにおけるシリアライゼーションのための最も広く使用されているライブラリまたはクレートであり、Serializeおよび特性を提供しますDeserialize。
一般的に、非再帰的かつ非共有のオブジェクトは、storeOn:/readFrom:プロトコルを使用して人間が読める形式で保存および取得できます。このstoreOn:メソッドは、を使用して評価すると元のオブジェクトを再現する Smalltalk 式のテキストを生成しますreadFrom:。このスキームは、データ自体ではなくオブジェクトの手続き的記述を使用するという点で特殊です。そのため、非常に柔軟で、クラスがよりコンパクトな表現を定義できます。ただし、元の形式では、循環データ構造を処理したり、共有参照の同一性を保持したりしません (つまり、単一のオブジェクトへの 2 つの参照は、同一ではない 2 つのコピーへの参照として復元されます)。このために、さまざまな移植可能な代替手段と移植不可能な代替手段が存在します。それらのいくつかは、特定の Smalltalk 実装またはクラス ライブラリに固有のものです。Squeak Smalltalkでは、オブジェクトをシリアライズして保存する方法がいくつかあります。最も簡単でよく使用されるのはstoreOn:/readFrom:、シリアライザに基づくバイナリ ストレージ フォーマットですSmartRefStream。さらに、バンドルされたオブジェクトは、を使用して保存および取得できますImageSegments。どちらも、いわゆる「バイナリオブジェクトストレージフレームワーク」を提供しており、コンパクトなバイナリ形式へのシリアル化とそこからの取得をサポートしています。どちらも、循環構造、再帰構造、共有構造、クラスおよびメタクラス情報のストレージ/取得を処理し、「オンザフライ」オブジェクト移行(つまり、異なるオブジェクトレイアウトを持つ古いバージョンのクラスによって書き込まれたインスタンスを変換する)のメカニズムを含んでいます。APIは似ていますが(storeBinary/readBinary)、エンコードの詳細が異なるため、これら2つの形式は互換性がありません。ただし、Smalltalk/Xコードはオープンソースで無料であり、他のSmalltalkにロードして、異なる方言のオブジェクト交換を可能にすることができます。オブジェクトのシリアル化は、ANSI Smalltalk仕様の一部ではありません。そのため、オブジェクトをシリアル化するコードは、Smalltalkの実装によって異なります。結果として得られるバイナリデータも異なります。たとえば、Squeak Smalltalkで作成されたシリアル化されたオブジェクトは、Ambrai Smalltalkでは復元できません。したがって、オブジェクトのシリアル化に依存する複数のSmalltalk実装で動作するさまざまなアプリケーションは、これらの異なる実装間でデータを共有できません。これらのアプリケーションには、MinneStore オブジェクト データベース[ 43 ]やいくつかのRPCパッケージが含まれます。この問題の解決策は SIXX [ 44 ]であり、これは複数の Smalltalk 用のパッケージで、シリアル化にXMLベースのフォーマットを使用します。
Swift標準ライブラリは、2 つのプロトコルと( として組み合わせられる) を提供しており、これらにより、準拠する型のインスタンスをJSON、プロパティ リスト、またはその他の形式にシリアル化したり、それらから逆シリアル化したりできます。[ 45 ]これらのプロトコルのデフォルト実装は、格納プロパティが またはでもある型に対してコンパイラによって生成できます。EncodableDecodableCodableDecodableEncodable
PowerShell は、組み込みのコマンドレットを使用してシリアル化を実装しますExport-CliXML。Export-CliXMLは .NET オブジェクトをシリアル化し、結果の XML をファイルに保存します。 オブジェクトを再構成するには、エクスポートされたファイルの XML から逆シリアル化されたオブジェクトを生成するコマンドレットを使用します。 逆シリアル化されたオブジェクトは、しばしば「プロパティバッグ」と呼ばれますが、ライブオブジェクトではありません。プロパティはありますがメソッドはないスナップショットです。 2 次元データ構造も、組み込みのコマンドレットとを使用してCSVImport-CliXML形式でシリアル化または逆シリアル化できます。Import-CSVExport-CSV
オブジェクトまたはオブジェクトのグループを取得し、ディスクに保存するか、有線または無線伝送メカニズムを介して送信し、後で、おそらく別のコンピュータで、プロセスを逆にして元のオブジェクトを復元することができます。基本的なメカニズムは、オブジェクトを1次元のビットストリームに平坦化し、そのビットストリームを元のオブジェクトに戻すことです。」
以下で説明するシリアライゼーションは、オブジェクトシステム内のオブジェクトが、埋め込まれているグラフを操作するために使用するツールの例です。これは、純粋なオブジェクトモデルによって提供されるカプセル化に違反する必要があるようです。
{{cite web}}: CS1 maint: 複数の名前: 著者リスト (リンク)ライザーには多くの種類があり、非常にコンパクトなデータを非常に高速に生成します。メッセージング用、データ ストア用、オブジェクトのマーシャリング用のシリアライザーがあります。.NET で最適なシリアライザーは何ですか?
「pickles」と呼ばれるメカニズムを使用しており、これは、厳密に型付けされたデータ構造と、永続ディスク ファイルに格納するのに適したその構造の表現との間で変換を行います。操作 Pickle.Write は、厳密に型付けされたデータ構造へのポインタを受け取り、ディスクに書き込むためのビット バッファを提供します。逆に、Pickle.Read は、ディスクからビット バッファを読み取り、元のデータ構造のコピーを提供します。(*) この変換には、構造内のアドレスの出現箇所を識別し、構造がディスクから読み戻されるときに、アドレスが現在の実行環境で有効なアドレスに置き換えられるようにする処理が含まれます。pickle メカニズムは完全に自動です。これは、ガベージ コレクション メカニズムに存在する実行時型付け構造によって駆動されます。... (*) ピクル化は、リモート プロシージャ コールのマーシャリングの概念と非常によく似ています。しかし実際には、我々のピクル化実装は
動的に型付けされた
値の構造を実行時に解釈することによってのみ機能し
、一方、RPC実装は静的に型付けされた値のマーシャリングのためのコードを生成することによってのみ機能します。それぞれの機能は、互いのメカニズムを追加することで恩恵を受けるはずですが、それはまだ実現されていません。
「フラット化」という名前の由来: 元の「marshal」モジュールはそのままにしておきたいので、また Jim が「シリアライゼーション」は永続オブジェクトへの
同時
アクセスという文脈では実際には全く異なる意味を持つと不満を述べたため、今後は「フラット化」という用語を使用することにします。 ... (Modula-3 システムでは、この概念に「pickled」データという用語を使用しています。おそらく既にすべての問題を解決しており、型安全な方法で解決しているのでしょう
:-)