シリアル化
コンピューティングでは、シリアライゼーション(またはシリアライゼーション) は、データ構造またはオブジェクトの状態を、格納 (例:セカンダリ ストレージ デバイスの ファイル、プライマリ ストレージ デバイスのデータ バッファー) または送信 (例:コンピュータ ネットワーク上のデータ ストリーム)できる形式に変換するプロセスです。) 後で再構築します (別のコンピューター環境で可能性があります)。[1]結果の一連のビットがシリアライゼーション形式に従って再読み取りされると、元のオブジェクトの意味的に同一のクローンを作成するために使用できます。参照を多用するオブジェクトなど、多くの複雑なオブジェクトの場合、このプロセスは簡単ではありません。オブジェクト指向オブジェクトのシリアル化には、以前にリンクされていた 関連メソッドは含まれません。
オブジェクトをシリアル化するこのプロセスは、状況によっては、オブジェクトのマーシャリングとも呼ばれます。[2] [3] [4]一連のバイトからデータ構造を抽出する反対の操作は、逆シリアル化(非シリアル化または非マーシャリングとも呼ばれます) です。
編集
方法:
- ワイヤを介してデータを転送する (メッセージング)。
- データの保存 (データベース内、ハードディスク ドライブ上)。
- リモート プロシージャ コール( SOAPなど) 。
- オブジェクトの配布、特にCOM、CORBAなどのコンポーネントベースのソフトウェア エンジニアリングで。
- 時変データの変化を検出します。
これらの機能の一部を有効にするには、アーキテクチャの独立性を維持する必要があります。たとえば、分散を最大限に活用するには、異なるハードウェア アーキテクチャで実行されているコンピューターが、エンディアンに関係なく、シリアル化されたデータ ストリームを確実に再構築できる必要があります。これは、データ構造のメモリ レイアウトを直接コピーする単純で高速な手順が、すべてのアーキテクチャで確実に機能するわけではないことを意味します。アーキテクチャに依存しない形式でデータ構造をシリアル化するということは、バイト順序、メモリ レイアウト、または異なるプログラミング言語でデータ構造を表現する単純な方法の問題を回避することを意味します。
データのエンコードは定義上シリアルであるため、シリアル化されたデータ構造の一部を抽出するには、オブジェクト全体を最初から最後まで読み取って再構築する必要があります。多くのアプリケーションでは、この線形性は資産です。単純で共通の I/O インターフェイスを使用して、オブジェクトの状態を保持および渡すことができるからです。より高いパフォーマンスが問題となるアプリケーションでは、より複雑で非線形のストレージ構成に対処するためにより多くの労力を費やすことは理にかなっています。
1 台のマシン上でも、プリミティブポインターオブジェクトは脆弱すぎて保存できません。これは、ポインター オブジェクトが指すオブジェクトがメモリ内の別の場所に再ロードされる可能性があるためです。これに対処するために、シリアライゼーション プロセスにはunswizzlingまたはpointer unswizzlingと呼ばれるステップが含まれます。このステップでは、直接ポインター参照が名前または位置に基づいて参照に変換されます。逆シリアル化プロセスには、ポインター スウィズリングと呼ばれる逆の手順が含まれます。
シリアル化と逆シリアル化の両方を共通コード ( Microsoft Foundation ClassesのSerialize関数など) から実行できるため、共通コードで両方を同時に実行できます。シリアル化されたものとその以前のコピー、および 2) 次のそのような検出のための入力を提供します。差異はその場で検出できるため、事前のコピーを実際にビルドする必要はありません。これは差分実行と呼ばれる手法です。これは、内容が時変するユーザー インターフェイスのプログラミングに役立ちます。グラフィカル オブジェクトを作成、削除、変更、または入力イベントを処理するように作成することができ、それらを実行するために別のコードを記述する必要はありません。
欠点
シリアライゼーションは、非公開の実装の詳細を公開する可能性があるため、抽象データ型の不透明性を壊します。すべてのデータ メンバーをシリアル化する単純な実装は、カプセル化に違反する可能性があります。[5]
競合他社が互換性のある製品を作成するのを思いとどまらせるために、プロプライエタリ ソフトウェアの発行者は、多くの場合、プログラムのシリアル化形式の詳細を企業秘密にしています。シリアル化されたデータを意図的に難読化したり、暗号化したりするものもあります。ただし、相互運用性を確保するには、アプリケーションが互いのシリアル化形式を理解できる必要があります。したがって、CORBAなどのリモート メソッド呼び出しアーキテクチャでは、シリアライゼーション形式が詳細に定義されています。
アーカイブやライブラリなどの多くの機関は、バックアップアーカイブ (特にデータベース ダンプ)を、比較的人間が読み取れるシリアル化された形式で保存することにより、将来の保証を試みています。
連載形式
1980 年代初頭の Xerox Network Systems Courier テクノロジは、広く採用された最初の標準に影響を与えました。Sun Microsystems は、 1987 年に外部データ表現(XDR)を公開しました。[6] XDR はオープン フォーマットであり、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 は、単一のシリアル化形式を参照するのではなく、人間が読み取れる形式と 1 つのバイナリ形式のいくつかの異なるバリアントを参照します。
衛星データや数値気候、気象、海洋モデルの出力など、大量の科学的データセットについては、特定のバイナリ シリアル化標準 ( HDF、netCDF、古いGRIBなど) が開発されています。
プログラミング言語のサポート
いくつかのオブジェクト指向プログラミング言語は、オブジェクトのシリアライゼーション(またはオブジェクトのアーカイブ) を、構文上のシュガー要素によって、またはそうするための標準インターフェースを提供することによって、直接サポートしています。これを行う言語には、Ruby、Smalltalk、Python、PHP、Objective-C、Delphi、Java、および.NETファミリの言語が含まれます。また、シリアライゼーションのネイティブ サポートがない言語にシリアライゼーション サポートを追加するライブラリも利用できます。
- C および C++
- CとC++ は、あらゆる種類の高レベル構造としてシリアライゼーションを提供しませんが、どちらの言語も、バイナリ データとしての組み込みデータ型と単純な古いデータ 構造体の書き込みをサポートしています。そのため、通常、カスタムのシリアライゼーション関数を書くのは簡単です。さらに、 C++ 用のODB ORMシステムや C および C++ 用のgSOAPツールキットなどのコンパイラ ベースのソリューションは、クラス宣言をほとんど、またはまったく変更せずにシリアル化コードを自動的に生成できます。他の一般的なシリアライゼーション フレームワークは、S11n フレームワーク[8]であるBoost FrameworkのBoost.Serialization [7]です。そして穀物。[9] MFC フレームワーク(Microsoft) も、Document-View アーキテクチャの一部としてシリアル化方法を提供します。
- CFML
- CFML では、タグを使用してデータ構造をWDDXにシリアル化し
<cfwddx>
、SerializeJSON()関数を使用してJSONにシリアル化できます。 - デルファイ
- Delphi は、IDEと完全に統合された、コンポーネント(永続オブジェクトとも呼ばれる)のシリアル化のための組み込みメカニズムを提供します。コンポーネントのコンテンツは DFM ファイルに保存され、オンザフライで再ロードされます。
- 行く
- Go は、JSONおよびXMLデータのアンマーシャリング/マーシャリングをネイティブにサポートします。[10] YAML [11]とProtocol Buffersをサポートするサードパーティ モジュールもあります。[12] Go はGobsもサポートしています。[13]
- ハスケル
- Haskell では、 Read および Show型クラスのメンバーである型に対してシリアル化がサポートされています。型クラスのメンバーであるすべての型は、
Read
ダンプされたデータの文字列表現からデータを抽出する関数を定義します。Show
次に、型クラスには、show
オブジェクトの文字列表現を生成できる関数。プログラマーは、関数を明示的に定義する必要はありません。型が Read を派生させるか、Show を派生させるか、またはその両方であると宣言するだけで、多くの場合に適切な関数をコンパイラに生成させることができます (ただし、すべてではありません。たとえば、関数型は Show を自動的に派生させることはできません)。または読む)。Show の自動生成されたインスタンスも有効なソース コードを生成するため、たとえば Haskell インタープリターで show によって生成されたコードを実行することで、同じ Haskell 値を生成できます。[14]より効率的なシリアル化のために、 binaryなどのバイナリ形式での高速シリアル化を可能にする haskell ライブラリがあります。 - ジャワ
- Java は、インターフェースを実装することによってオブジェクトをマークする必要がある自動シリアライゼーションを提供します。インターフェイスを実装すると、クラスが「シリアル化しても問題ありません」とマークされ、Java がシリアル化を内部で処理します。インターフェイスで定義されたシリアライゼーション メソッドはありませんが、シリアライズ可能なクラスでは、特定の特別な名前とシグネチャを持つメソッドをオプションで定義できます。この言語では、オブジェクトの状態を保存および復元するために使用される 2 つの特別なメソッドを含む別のインターフェイス (インターフェイス) を実装することにより、開発者はシリアライゼーション プロセスをより徹底的にオーバーライドすることもできます。
java.io.Serializable
Serializable
Externalizable
オブジェクトがデフォルトで直列化可能ではなく、Serializable
Java の直列化メカニズムにアクセスするためのインターフェースを実装する必要がある主な理由は 3 つあります。
まず、すべてのオブジェクトがシリアライズされた状態で有用なセマンティクスを取得できるわけではありません。たとえば、オブジェクトは現在のJVMThread
の状態に関連付けられています。逆シリアル化されたオブジェクトが有用なセマンティクスを維持するコンテキストはありません。次に、オブジェクトのシリアル化された状態は、そのクラスの互換性契約の一部を形成します。シリアライズ可能なクラスのバージョン間の互換性を維持するには、追加の作業と考慮が必要です。したがって、クラスをシリアライズ可能にすることは、デフォルトの条件ではなく、慎重な設計上の決定である必要があります。最後に、シリアル化により、非Thread
他の方法ではアクセスできないクラスの一時的なプライベート メンバー。機密情報 (パスワードなど) を含むクラスは、シリアライズ可能または外部化可能であってはなりません。標準のエンコード方式では、オブジェクトのクラス記述子とシリアル化可能なフィールドを再帰的にグラフベースに変換してバイト ストリームに変換します。プリミティブと非一時的で非静的な参照オブジェクトは、ストリームにエンコードされます。としてマークされていないフィールドを介してシリアル化されたオブジェクトによって参照される各オブジェクトtransient
また、シリアル化する必要があります。また、非一時オブジェクト参照の完全なグラフ内のオブジェクトがシリアライズ可能でない場合、シリアライズは失敗します。開発者は、オブジェクトを一時的なものとしてマークするか、オブジェクトのシリアル化を再定義して、参照グラフの一部を切り捨ててシリアル化しないようにすることで、この動作に影響を与えることができます。
Java はコンストラクターを使用してオブジェクトをシリアライズしません。JDBCを介して Java オブジェクトをシリアライズし、データベースに格納することができます。[15]スイング中コンポーネントは Serializable インターフェースを実装しますが、Java 仮想マシンの異なるバージョン間での移植性は保証されていません。そのため、Swing コンポーネント、またはそれを継承する任意のコンポーネントは、バイト ストリームにシリアル化できますが、これが別のマシンで再構成可能であるという保証はありません。 - JavaScript
- ECMAScript 5.1 以降、[16] JavaScriptには組み込みオブジェクト
JSON
とそのメソッドJSON.parse()
およびJSON.stringify()
. JSON はもともと JavaScript のサブセットに基づいていますが[17] 、 JSON が有効な JavaScript ではない境界ケースがあります。具体的には、JSON ではUnicode の行末記号 U+2028 LINE SEPARATORおよびU+2029 PARAGRAPH SEPARATORを引用符付き文字列でエスケープしないで表示できますが、ECMAScript 2018 以前ではそうではありません。[18] [19] JSON に関する主な記事を参照してください。 - ジュリア
- Julia は、 [20]
serialize()
Julia の同じバージョン、および/または同じシステム イメージのインスタンス内で動作することを意図した/deserialize()
モジュールを介してシリアル化を実装します。[21]このパッケージは、文書化された形式と、さまざまな言語のラッパーを備えた共通ライブラリを使用して、より安定した代替手段を提供します[22]一方で、デフォルトのシリアライゼーション形式は、ネットワーク通信の最大のパフォーマンスを念頭に置いて設計されていることが示唆されています。[23]HDF5.jl
- 舌足らずの発音
- 通常、Lispデータ構造は関数 "
read
" と "print
" でシリアル化できます。たとえば、配列のリストを含む変数 foo は、 によって出力されます(print foo)
。同様に、オブジェクトは s by という名前のストリームから読み取ることができます(read s)
。Lisp 実装のこれら 2 つの部分は、プリンターとリーダーと呼ばれます。" " の出力はprint
人間が読むことができます。括弧で区切られたリストを使用します。例: . Common Lispを含む多くの種類の Lisp では、どのように行うかが明確でないため、プリンターはすべての種類のデータを表すことができません。たとえば、Common Lisp では、プリンターは CLOS オブジェクトを印刷できません。代わりに、プログラマーはジェネリック関数でメソッドを書くことができます(4 2.9 "x" y)
print-object
、これはオブジェクトが印刷されるときに呼び出されます。これは、Ruby で使用されている方法と多少似ています。Lisp コード自体は、読み取り構文と呼ばれるリーダーの構文で記述されます。ほとんどの言語は、コードとデータを処理するために別個の異なるパーサーを使用しますが、Lisp は 1 つだけを使用します。Lisp コードを含むファイルは、データ構造としてメモリに読み込まれ、別のプログラムによって変換された後、 read–eval–print ループなどで実行または書き出される可能性があります。すべてのリーダー/ライターが循環、再帰、または共有構造をサポートしているわけではありません。 - 。ネットフレームワーク
- .NET Framework には、Microsoftによって設計されたいくつかのシリアライザーがあります。サードパーティによるシリアライザも多数あります。ここでは、 10 を超えるシリアライザーについて説明し、テストしています。[24]とここ[25]
- OCaml
- OCamlの標準ライブラリは、
Marshal
モジュール[3]と Pervasives 関数output_value
および を介してマーシャリングを提供しますinput_value
。OCaml プログラミングは静的に型チェックされますが、Marshal
マーシャリングされていないストリームが期待される型のオブジェクトを表しているかどうかを確認する方法がないため、モジュールは型の保証を破る可能性があります。OCaml では、関数または関数を含むデータ構造 (メソッドを含むオブジェクトなど) をマーシャリングすることは困難です。これは、関数内の実行可能コードを異なるプログラム間で転送できないためです。(関数のコード位置をマーシャリングするためのフラグがありますが、まったく同じプログラムでしかアンマーシャリングできません)。標準のマーシャリング関数は、共有を維持し、フラグによって構成できる循環データを処理できます。 - パール
- CPANから入手できるいくつかのPerlモジュールは、 、 、およびを含むシリアライゼーション メカニズムを提供します。Storable には、Perl データ構造をファイルまたは Perl スカラーとの間でシリアライズおよびデシリアライズする関数が含まれています。ファイルへの直接のシリアル化に加えて、スカラーにパックされたデータのシリアル化されたコピーを返し、そのようなスカラーを逆シリアル化する関数が含まれています。これは、複雑なデータ構造をネットワーク ソケット経由で送信したり、データベースに格納したりする場合に便利です。を使用して構造体をシリアル化する場合、データを常に任意のコンピューターで読み取り可能な形式で保存するネットワーク セーフ関数があり、速度はわずかに低下します。これらの関数の名前は、
Storable
JSON::XS
FreezeThaw
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のterm構造は、組み込み述語を介してシリアル化され
write_term/3
、組み込み述語read/1
andを介してシリアル化されますread_term/2
。結果のストリームは、圧縮されていないテキスト (ターゲット ストリームの構成によって決定されるエンコード) であり、用語内の自由変数はプレースホルダー変数名で表されます。述語は、Prolog の ISO 仕様write_term/3
で標準化されています。(ISO/IEC 13211-1) 59 ページ以降。(「用語を書く、§ 7.10.5」)。したがって、ある実装でシリアライズされた用語は、あいまいさや驚きなしに別の実装でシリアライズできることが期待されます。実際には、実装固有の拡張 (SWI-Prolog の辞書など) は非標準の用語構造を使用する場合があるため、極端なケースでは相互運用性が損なわれる可能性があります。例として、SWI-Prolog、 [29] SICStus Prolog、[30] GNU Prologの対応するマニュアル ページを参照してください。[31]ネットワーク経由で受信したシリアル化された用語が仕様に対してチェックされるかどうか、およびその方法は (文字ストリームからの逆シリアル化が行われた後に) 実装者に任されます。Prolog の組み込み定款文法は、その段階で適用できます。 - パイソン
- 中核となる一般的なシリアライゼーション メカニズムは標準
pickle
ライブラリモジュールであり、データのシリアライゼーション (逆シリアライズのためのunpickling )を説明するためのデータベース システム用語pickling [32] [33] [34]をほのめかしています。Pickle は、オブジェクトの再構築に使用される命令を記録する単純なスタックベースの仮想マシンを使用します。これはバージョン間でカスタマイズ可能ですが、安全ではありません (誤ったデータや悪意のあるデータに対して安全ではありません) シリアル化形式です。不正な形式または悪意を持って作成されたデータにより、デシリアライザーが任意のモジュールをインポートし、任意のオブジェクトをインスタンス化する可能性があります。[35] [36]標準ライブラリには、標準データ形式にシリアル化するモジュールも含まれています (基本的なスカラーおよびコレクション型のサポートが組み込まれており、エンコードおよびデコード フックをjson
介して任意の型をサポートできます)。(バイナリと XMLプロパティ リスト形式の両方をサポート)。(RFC 1014 で説明されているように、External Data Representation (XDR) 標準をサポートしています)。最後に、オブジェクトは適切な環境で評価可能であることが推奨され、Common Lisp の. すべてのオブジェクト タイプを自動的に pickle できるわけではありません。特に、ファイル ハンドルなどのオペレーティング システムリソースを保持するものはそうです。plistlib
xdrlib
__repr__
print-object
ですが、ユーザーはカスタムの「リダクション」関数と構築関数を登録して、任意の型の酸洗いと酸洗い解除をサポートできます。Pickle はもともと純粋な Pythonpickle
モジュールとして実装されていましたが、3.0 より前のバージョンの Python では、cPickle
モジュール (これも組み込み) のパフォーマンスが向上しています (最大 1000 倍高速[35] )。Unladen SwallowcPickle
プロジェクトから改作されました。Python 3 では、ユーザーは常に標準バージョンをインポートする必要があります。標準バージョンは高速バージョンをインポートしようとし、純粋な Python バージョンにフォールバックします。[37] - R
- R
dput
には、R オブジェクトの ASCII テキスト表現をファイルまたは接続に書き込む関数があります。を使用してファイルから表現を読み取ることができますdget
。[38]より具体的には、関数はserialize
R オブジェクトを接続にシリアル化し、出力は 16 進数形式でコード化された生のベクトルです。このunserialize
関数を使用すると、接続または生のベクトルからオブジェクトを読み取ることができます。[39] - リボル
- REBOL は
save/all
ファイル ( ) またはstring!
( )にシリアライズしますmold/all
。文字列とファイルは、ポリモーフィックload
関数を使用して逆シリアル化できます。Protocol Buffers をRProtoBuf
使用して、R で言語間データのシリアル化を提供します。[40] - ルビー
- Ruby には、標準の Unix ユーティリティとに似た、と の
Marshal
2 つのメソッドを持つ標準モジュールが含まれています。これらのメソッドは、標準クラスにシリアライズされます。つまり、実質的に一連のバイトになります。一部のオブジェクトはシリアル化できません (シリアル化すると例外が発生します): バインド、プロシージャ オブジェクト、クラス IO のインスタンス、シングルトン オブジェクト、およびインターフェイス。クラスでカスタムのシリアル化が必要な場合 (たとえば、ダンプ/復元時に特定のクリーンアップ アクションを実行する必要がある場合)、と の2 つのメソッドを実装することで実行できます。インスタンス メソッドはdump
load
dump
restore
String
TypeError
_dump
_load
_dump
String
このクラスのオブジェクトと参照されるすべてのオブジェクトを再構成するために必要なすべての情報を、整数パラメーターとして指定された最大深度まで含むオブジェクト (値 -1 は、深度チェックを無効にする必要があることを意味します)。クラス メソッドは_load
を取りString
、このクラスのオブジェクトを返す必要があります。 - さび
Serde
Rustでのシリアル化に最も広く使用されているライブラリまたはクレートです。- スモールトーク
- 一般に、非再帰的および非共有オブジェクトは、
storeOn:
/readFrom:
プロトコルを使用して人間が読める形式で保存および取得できます。メソッドstoreOn:
は Smalltalk 式のテキストを生成します。readFrom:
- 元のオブジェクトを再作成します。このスキームは、データ自体ではなく、オブジェクトの手続き的な記述を使用するという点で特別です。したがって、非常に柔軟で、クラスがよりコンパクトな表現を定義できます。ただし、元の形式では、循環データ構造を処理したり、共有参照の同一性を保持したりしません (つまり、1 つのオブジェクトの 2 つの参照は、2 つの等しいが同一ではないコピーへの参照として復元されます)。このために、さまざまなポータブルおよび非ポータブルの代替手段が存在します。それらのいくつかは、特定の Smalltalk 実装またはクラス ライブラリに固有のものです。Squeak Smalltalkでオブジェクトをシリアライズして保存する方法はいくつかあります。最も簡単で最もよく使用されるのは、storeOn:/readFrom:
以下に基づくバイナリ ストレージ形式です。SmartRefStream
シリアライザー。さらに、バンドルされたオブジェクトは、次を使用して保存および取得できます。ImageSegments
. どちらも、いわゆる「バイナリ オブジェクト ストレージ フレームワーク」を提供します。これは、コンパクトなバイナリ形式へのシリアル化とそこからの取得をサポートします。どちらも、循環、再帰、共有構造、クラスおよびメタクラス情報の格納/取得を処理し、「オンザフライ」オブジェクト移行 (つまり、異なるオブジェクト レイアウトを持つ古いバージョンのクラスによって記述されたインスタンスを変換する) のメカニズムを含みます。API は似ていますが (storeBinary/readBinary)、エンコードの詳細が異なるため、これら 2 つの形式には互換性がありません。ただし、Smalltalk/X コードはオープン ソースで無料であり、他の Smalltalk にロードして方言を超えたオブジェクト交換を可能にすることができます。オブジェクトのシリアル化は、ANSI Smalltalk 仕様の一部ではありません。その結果、オブジェクトをシリアライズするコードは Smalltalk の実装によって異なります。結果のバイナリ データも異なります。たとえば、Squeak Smalltalk で作成されたシリアル化されたオブジェクトは、Squeak Smalltalk では復元できません。アンブレ スモールトーク. その結果、オブジェクトのシリアル化に依存する複数の Smalltalk 実装で動作するさまざまなアプリケーションは、これらの異なる実装間でデータを共有できません。これらのアプリケーションには、MinneStore オブジェクト データベース[41]といくつかのRPCパッケージが含まれます。この問題の解決策は、シリアライゼーションにXMLベースのフォーマットを使用する複数の Smalltalk 用のパッケージであるSIXX [42]です。 - 迅速
- Swift標準ライブラリは、2 つのプロトコルおよび(一緒に として構成されます) を提供します。これらは、準拠する型のインスタンスをJSON、プロパティ リスト、またはその他の形式にシリアライズまたはデシリアライズすることを可能にします。[43]これらのプロトコルのデフォルトの実装は、格納されたプロパティがまたは である型に対してコンパイラによって生成できます。
Encodable
Decodable
Codable
Decodable
Encodable
- Windows PowerShell
- Windows PowerShell は、組み込みのコマンドレットを介してシリアル化を実装します
Export-CliXML
。Export-CliXML
.NET オブジェクトをシリアル化し、結果の XML をファイルに格納します。オブジェクトを再構成するには、Import-CliXML
エクスポートされたファイルの XML から逆シリアル化されたオブジェクトを生成するコマンドレットを使用します。「プロパティ バッグ」と呼ばれることが多いデシリアライズされたオブジェクトは、ライブ オブジェクトではありません。プロパティはあるがメソッドがないスナップショットです。2 次元データ構造は、組み込みのコマンドレットとを使用して、 CSV形式で (逆) シリアル化することもできます。Import-CSV
Export-CSV
も参照
- コミュテーション(テレメトリー)
- データのシリアル化形式の比較
- コンテナ形式
- 休止状態 (Java)
- XML スキーマ
- 基本的なエンコード規則
- Google プロトコル バッファ
- ウィキベース
- アパッチ・アブロ
参考文献
- ^ クライン、マーシャル. 「C++ FAQ: 「この「シリアライゼーション」とは何ですか?」" . 2015 年 4 月 5 日にオリジナルからアーカイブされました。
これにより、オブジェクトまたはオブジェクトのグループを取得し、ディスクに配置したり、有線または無線の転送メカニズムを介して送信したりできます。その後、おそらく別のコンピューターで、基本的なメカニズムは、オブジェクトを 1 次元のビット ストリームにフラット化し、そのビット ストリームを元のオブジェクトに戻すことです。
- ^ "モジュール: マーシャル (Ruby 3.0.2)" . ruby-doc.org 。2021年7月25日閲覧。
- ^ a b "元帥" . OCaml . 2021年7月25日閲覧。
- ^ 「Python 3.9.6 ドキュメント - Python オブジェクトのシリアル化 —pickle」 . ドキュメント - Python 標準ライブラリ.
- ^ S. ミラー、マーク。「相互疑いの下での安全なシリアル化」 . Eライツ.org .
以下で説明するシリアライゼーションは、オブジェクト システム内のオブジェクトが埋め込まれているグラフを操作するために使用するツールの例です。これには、純粋なオブジェクト モデルによって提供されるカプセル化に違反する必要があるようです。
- ^ サン・マイクロシステムズ (1987). 「XDR: 外部データ表現標準」 . RFC1014。ネットワーク ワーキング グループ。2011 年7 月 11 日閲覧。
- ^ 「連載」 . www.boost.org。
- ^ ビール、ステファン。「s11n.net: C++ でのオブジェクトのシリアル化/永続化」 . s11n.net .
- ^ "シリアル ドキュメント - メイン" . uscilab.github.io .
- ^ 「パッケージのエンコーディング」 . pkg.go.dev。2021 年 7 月 12 日。
- ^ "GitHub - Go 言語の YAML サポート" . GitHub . 2021年7月25日閲覧。
- ^ "プロト・pkg.go.dev" . pkg.go.dev 。2021年6月22日閲覧。
- ^ "gob パッケージ - encoding/gob - pkg.go.dev" . pkg.go.dev 。2022 年 3 月 4 日閲覧。
- ^ "Text.Show ドキュメンテーション" . 2014 年1 月 15 日閲覧。
- ^ 「TOM に尋ねる」「データベースへの Java オブジェクトのシリアル化 (および ge...」" .asktom.oracle.com . _
- ^ "JSON" . MDN Web ドキュメント. 2018 年3 月 22 日閲覧。
- ^ "JSON" . www.json.org 。2018 年3 月 22 日閲覧。
- ^ ホルム、マグナス (2011 年 5 月 15 日). 「JSON: そうでない JavaScript サブセット」 . 時代を超越したリポジトリ。2016 年9 月 23 日閲覧。
- ^ "TC39 提案: JSON を含める" . ECMA TC39 委員会。2018 年 5 月 22 日。
- ^ 「連載」 . ジュリア言語。2021年7月25日閲覧。
- ^ "シンボルと文字列のより高速でコンパクトなシリアル化 · JuliaLang/[email protected]" . GitHub .
- ^ "HDF5.jl: HDF5 ファイル形式でのデータの保存と読み込み" . 2017 年 8 月 20 日 – GitHub 経由。
- ^ "Julia: serialize() / deserialize() の安定性" . stackoverflow.com。2014年。
- ^ ".NET シリアライザー" .
多くの種類のシリアライザーがあります。
非常にコンパクトなデータを非常に高速に生成します。
メッセージング用、データ ストア用、オブジェクトのマーシャリング用のシリアライザがあります。
.NET で最高のシリアライザーは何ですか?
- ^ "aumcodeによるSERBENCH" . aumcode.github.io .
- ^ "PHP: オブジェクトのシリアル化 - マニュアル" . ca.php.net。
- ^ エッサー、スティーブン (2009-11-28). 「PHP エクスプロイトのショッキング ニュース」 . 容疑者.. 2012-01-06 のオリジナルからのアーカイブ。
- ^ "PHP: シリアライズ可能 - マニュアル" . www.php.net。
- ^ "「用語の読み書き」" . www.swi-prolog.org .
- ^ ""write_term/[2,3]"" .sicstus.sics.se . _
- ^ "「項入出力」" .gprolog.org . _
- ^ Herlihy、モーリス; Liskov、バーバラ(1982 年 10 月)。「抽象データ型の値の送信方法」(PDF) . プログラミング言語とシステムに関する ACM トランザクション。4 (4): 527–551。CiteSeerX 10.1.1.87.5301 . ドイ: 10.1145/69622.357182 . ISSN 0164-0925 . OCLC 67989840。S2CID 8126961 .
- ^ ビレル、アンドリュー; ジョーンズ、マイク。ウォバー、テッド (1987 年 11 月)。「小規模データベースのシンプルで効率的な実装」. ACM SIGOPS オペレーティング システムのレビュー: オペレーティング システムの原則に関する第 11 回 ACM シンポジウムの議事録。11 (5): 149–154. CiteSeerX 10.1.1.100.1457 . ドイ: 10.1145/41457.37517 . ISSN 0163-5980。OCLC 476062921。S2CID 12908261 .
私たちの実装では、"pickles" と呼ばれるメカニズムを利用しています。このメカニズムは、厳密に型指定されたデータ構造と、永続的なディスク ファイルに格納するのに適した構造の表現との間で変換を行います。操作 Pickle.Write は、厳密に型指定されたデータ構造へのポインターを受け取り、ディスクに書き込むためのビットのバッファーを提供します。逆に、Pickle.Read はディスクからビットのバッファを読み取り、元のデータ構造のコピーを配信します。(*) この変換には、構造内のアドレスの出現を識別し、構造がディスクから読み戻されるときにアドレスが現在の実行環境で有効なアドレスに置き換えられます。pickle メカニズムは完全に自動化されています。これは、ガベージ コレクション メカニズムに存在するランタイム型付け構造によって駆動されます。... (*) pickling は、リモート プロシージャ コールでのマーシャリングの概念に非常に似ています。しかし実際には、ピクルス化の実装は動的に型付けされた値の構造を実行時に解釈することによってのみ機能しますが、RPC 実装は静的に型付けされた値のマーシャリング用のコードを生成することによってのみ機能します。各施設は、他のメカニズムを追加することで利益を得ることができますが、それはまだ行われていません。
- ^ van Rossum、Guido (1994 年 12 月 1 日)。「Python オブジェクトのフラット化」 . Python プログラミング言語 – 従来の Web サイト. 米国デラウェア州: Python Software Foundation 。2017年4月6日閲覧。
'flattening' という名前の由来: 元の 'marshal' モジュールをそのままにしておきたいので、Jim は 'serialization' も永続オブジェクトへの同時アクセスのコンテキストで実際に関連するまったく別のものを意味すると不平を言ったので、私は使用しますこれからは「平坦化」という言葉。
... (Modula-3 システムでは、この概念に「ピクルス化」データという用語を使用しています。おそらく、すべての問題は既に解決されていますが、
- ^ a b "11.1. pickle — Python オブジェクトのシリアル化 — Python 2.7.14rc1 ドキュメント" . docs.python.org .
- ^ "pickle — Python オブジェクトのシリアル化 — Python v3.0.1 ドキュメント" . docs.python.org .
- ^ 「Python 3.0 の新機能 — Python v3.1.5 ドキュメント」 . docs.python.org .
- ^ [R マニュアルhttp://stat.ethz.ch/R-manual/R-patched/library/base/html/dput.html ]
- ^ [R マニュアルhttp://stat.ethz.ch/R-manual/R-patched/library/base/html/serialize.html ]
- ^ Eddelbuettel、ダーク。ストークリー、マレー。Ooms、Jeroen (2014)。「RProtoBuf: R での効率的なクロスランゲージ データ シリアライゼーション」. 統計ソフトウェアのジャーナル。71 (2)。arXiv : 1401.7372 . ドイ: 10.18637/jss.v071.i02 . S2CID 36239952 .
- ^ 「ミネストア バージョン2」 . ソースフォージ。2005 年 5 月 11 日にオリジナルからアーカイブされました。
- ^ 「新機能」 . SIXX - XML での Smalltalk インスタンス交換。2010 年 1 月 23 日。2021年7月25日閲覧。
- ^ 「Swift のアーカイブとシリアル化」 . www.github.com。2018-12-02.
外部リンク
- Java オブジェクトのシリアル化に関するドキュメント
- Java 1.4 オブジェクトのシリアル化に関するドキュメント。
- Durable Java: Serialization 2005 年 11 月 25 日に Wayback Machineでアーカイブ
- XML データ バインディング リソース
- Databoard - 部分的およびランダムアクセス、型システム、RPC、型適応、およびテキスト形式によるバイナリシリアル化