シリアル化

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

コンピューティングでは、シリアル化(USスペル)またはシリアル化(UKスペル)は、データ構造またはオブジェクトの状態を、保存(たとえば、ファイルまたはメモリデータバッファー)または送信(たとえば、コンピュータネットワークを介して)、後で再構築されます(おそらく別のコンピュータ環境で)。[1]結果の一連のビットがシリアル化形式に従って再読み取りされると、元のオブジェクトの意味的に同一のクローンを作成するために使用できます。参照を多用するオブジェクトなど、多くの複雑なオブジェクトの場合、このプロセスは簡単ではありません。オブジェクト指向オブジェクトのシリアル化には、以前にリンクされていた関連メソッドは含まれていません

オブジェクトをシリアル化するこのプロセスは、状況によってはオブジェクトのマーシャリングとも呼ばれます。[2] [3] [4]一連のバイトからデータ構造を抽出する反対の操作は、逆シリアル化(非シリアル化または非マーシャリングとも呼ばれます)です。

を使用します

方法:

これらの機能の一部を使用するには、アーキテクチャの独立性を維持する必要があります。たとえば、ディストリビューションを最大限に活用するには、異なるハードウェアアーキテクチャで実行されているコンピュータが、エンディアンに関係なく、シリアル化されたデータストリームを確実に再構築できる必要があります。これは、データ構造のメモリレイアウトを直接コピーするより簡単で高速な手順が、すべてのアーキテクチャで確実に機能するとは限らないことを意味します。アーキテクチャに依存しない形式でデータ構造をシリアル化するということは、バイト順序、メモリレイアウト、またはさまざまなプログラミング言語でデータ構造を表現するさまざまな方法の問題を防ぐことを意味します。

シリアル化スキームに固有のことは、データのエンコードは定義上シリアルであるため、シリアル化されたデータ構造の一部を抽出するには、オブジェクト全体を最初から最後まで読み取り、再構築する必要があるということです。多くのアプリケーションでは、この線形性は資産です。これにより、単純で一般的なI / Oインターフェイスを利用して、オブジェクトの状態を保持および渡すことができるようになります。より高いパフォーマンスが問題となるアプリケーションでは、より複雑な非線形ストレージ組織に対処するためにより多くの労力を費やすことが理にかなっています。

単一のマシン上でも、プリミティブポインタオブジェクトは脆弱すぎて保存できません。これは、それらが指すオブジェクトがメモリ内の別の場所に再ロードされる可能性があるためです。これに対処するために、シリアル化プロセスには、unswizzlingまたはpointer unswizzlingと呼ばれるステップが含まれます。このステップでは、直接ポインター参照が名前または位置に基づいて参照に変換されます。デシリアライズプロセスには、ポインタスウィズリングと呼ばれる逆のステップが含まれます。

シリアル化と逆シリアル化の両方を共通のコード(たとえば、Microsoft Foundation ClassesのSerialize関数)から駆動できるため、共通のコードで両方を同時に実行でき、1)オブジェクト間の違いを検出できます。シリアル化されたそれらの以前のコピー、および2)次のそのような検出のための入力を提供します。差分実行と呼ばれる手法である差分をその場で検出できるため、実際に事前のコピーを作成する必要はありません。これは、内容が時間とともに変化するユーザーインターフェイスのプログラミングに役立ちます。グラフィカルオブジェクトは、入力イベントを処理するために必ずしも個別のコードを記述しなくても、作成、削除、変更、または作成できます。

欠点

シリアル化は、プライベート実装の詳細を公開する可能性があるため、抽象データ型の不透明性を解消します。すべてのデータメンバーをシリアル化する簡単な実装は、カプセル化に違反する可能性があります。[5]

競合他社が互換性のある製品を作ることを思いとどまらせるために、プロプライエタリソフトウェアの発行者は、プログラムのシリアル化形式の詳細を企業秘密に保つことがよくあります。シリアル化されたデータを意図的に難読化または暗号化するものもあります。ただし、相互運用性を実現するには、アプリケーションが互いのシリアル化形式を理解できる必要があります。したがって、CORBAなどのリモートメソッド呼び出しアーキテクチャは、シリアル化形式を詳細に定義します。

アーカイブやライブラリなどの多くの機関は、バックアップアーカイブ、特にデータベースダンプを、比較的人間が読める形式のシリアル化された形式で保存することにより、将来にわたって利用できるようにしよます

シリアル化フォーマット

1980年代初頭のXeroxNetwork Systems Courierテクノロジーは、最初に広く採用された標準に影響を与えました。Sun Microsystemsは、1987年にExternal Data Representation (XDR)を公開しました。 [6] XDRはオープン形式であり、 STD 67(RFC 4506) として標準化されています。

1990年代後半に、標準のシリアル化プロトコルに代わるものを提供するための取り組みが始まりまし。SGMLサブセットであるXMLを使用して、人間が読めるテキストベースのエンコーディングを作成しました。このようなエンコーディングは、プログラミング言語に関係なく、人間が読み取って理解したり、他のシステムと通信したりする可能性のある永続オブジェクトに役立ちます。よりコンパクトなバイトストリームベースのエンコーディングが失われるという欠点がありますが、この時点で、ストレージと伝送容量が大きくなると、コンピューティングの初期よりもファイルサイズの問題が少なくなります。2000年代には、XMLは、AjaxWebアプリケーションのクライアントとサーバー間の構造化データの非同期転送によく使用されていました。XMLはオープンフォーマットであり、W3C勧告

JSONは、XMLのより軽量なプレーンテキストの代替手段であり、Webアプリケーションのクライアント/サーバー通信にも一般的に使用されます。JSONはJavaScript構文に基づいていますが、JavaScriptに依存せず、他のプログラミング言語でもサポートされています。JSONはオープンフォーマットであり、STD 90RFC  8259)、ECMA-404、およびISO / IEC 21778:2017として標準化されています。

YAMLは厳密なJSONスーパーセットであり、データタイプのタグ付けの概念、非階層データ構造のサポート、インデントを使用してデータを構造化するオプション、複数の形式のスカラーデータ引用などの追加機能が含まれています。YAMLはオープンフォーマットです。

プロパティリストは、 NeXTSTEPGNUstepmacOS、およびiOS フレームワークによるシリアル化に使用されますプロパティリスト、または略してp-listは、単一のシリアル化形式を参照していませんが、代わりに、人間が読める形式と1つのバイナリを含むいくつかの異なるバリアントを参照しています。

衛星データや数値の気候、天気、または海洋モデルの出力などの大量の科学データセットについては、HDFnetCDF、古いGRIBなどの特定のバイナリシリアル化標準が開発されています。

プログラミング言語のサポート

いくつかのオブジェクト指向プログラミング言語は、構文糖衣要素によって、またはそうするための標準インターフェースを提供することによって、オブジェクトのシリアル化(またはオブジェクトのアーカイブ)を直接サポートしますそのための言語には、RubySmalltalkPythonPHPObjective-CDelphiJava、および.NETファミリーの言語が含まれます。ネイティブサポートがない言語にシリアル化サポートを追加するライブラリも利用できます。

CおよびC ++
CおよびC ++は、あらゆる種類の高レベル構造体としてのシリアル化を提供しませんが、どちらの言語も、組み込みデータ型のいずれか、およびプレーンな古いデータ 構造体をバイナリデータとして書き込むことをサポートします。そのため、通常、カスタムシリアル化関数を作成するのは簡単です。さらに、C ++用のODBORM システムやCおよびC ++用のgSOAPツールキットなどのコンパイラベースのソリューションは、クラス宣言をほとんどまたはまったく変更せずにシリアル化コードを自動的に生成できます。その他の一般的なシリアル化フレームワークは、BoostFrameworkのBoost.Serialization [7]S11nフレームワーク[8]です。とシリアル。[9] MFCフレームワーク(Microsoft)は、Document-Viewアーキテクチャの一部としてシリアル化方法も提供します。
CFML
CFMLを使用すると、データ構造をタグを使用してWDDXにシリアル化し、SerializeJSON()関数を使用してJSONシリアルできます<cfwddx>
Delphi
Delphiは、コンポーネント(永続オブジェクトとも呼ばれます)をシリアル化するための組み込みメカニズムを提供します。これは、IDEと完全に統合されています。コンポーネントのコンテンツはDFMファイルに保存され、オンザフライで再ロードされます。
行け
Goは、 JSONおよびXMLデータのアンマーシャリング/マーシャリングをネイティブにサポートします。[10] YAML [11]プロトコルバッファをサポートするサードパーティのモジュールもあります[12]
Haskell
Haskellでは、Read型クラスとShow型クラスのメンバーである型に対してシリアル化がサポートされています型クラスのメンバーであるすべての型はRead、ダンプされたデータの文字列表現からデータを抽出する関数を定義します。次に、Show型クラスにはshowオブジェクトの文字列表現を生成できる関数。プログラマーは関数を明示的に定義する必要はありません。ReadまたはShowを派生させる型、あるいはその両方を宣言するだけで、コンパイラーに多くの場合に適切な関数を生成させることができます(ただし、すべてではありません。たとえば、関数型はShowを自動的に派生させることはできません。または読み取り)。Showの自動生成されたインスタンスも有効なソースコードを生成するため、たとえばHaskellインタープリターでshowによって生成されたコードを実行することで、同じHaskell値を生成できます。[13]より効率的なシリアル化のために、バイナリ形式、たとえばバイナリでの高速シリアル化を可能にするhaskellライブラリがあります
Java
Javaは自動シリアル化を提供します。これには、インターフェースを実装することによってオブジェクトにマークを付ける必要があります。インターフェイスを実装すると、クラスは「シリアル化しても大丈夫」とマークされ、Javaが内部でシリアル化を処理します。インターフェイスで定義されたシリアル化メソッドはありませんが、シリアル化可能なクラスは、オプションで、特定の特別な名前と署名を使用してメソッドを定義できます。これらのメソッドは、定義されている場合、シリアル化/逆シリアル化プロセスの一部として呼び出されます。この言語を使用すると、開発者は、オブジェクトの状態を保存および復元するために使用される2つの特別なメソッドを含む別のインターフェイス、インターフェイスを実装することにより、シリアル化プロセスをより完全にオーバーライドできます。java.io.Serializable SerializableExternalizable
Serializableオブジェクトがデフォルトでシリアル化できず、 Javaのシリアル化メカニズムにアクセスするためのインターフェースを実装する必要がある主な理由は3つあります。
まず、すべてのオブジェクトがシリアル化された状態で有用なセマンティクスをキャプチャするわけではありません。たとえば、Threadオブジェクトは現在のJVMの状態に関連付けられています。Threadデシリアライズされたオブジェクトが有用なセマンティクスを維持するコンテキストはありません。
次に、オブジェクトのシリアル化された状態は、そのクラスの互換性コントラクトの一部を形成します。シリアル化可能なクラスのバージョン間の互換性を維持するには、追加の作業と考慮が必要です。したがって、クラスをシリアライズ可能にすることは、デフォルトの条件ではなく、意図的な設計上の決定である必要があります。
最後に、シリアル化により、他の方法ではアクセスできないクラスの一時的なプライベートメンバー。機密情報(パスワードなど)を含むクラスは、シリアル化も外部化もできません。標準のエンコーディング方法では、オブジェクトのクラス記述子とシリアル化可能なフィールドの再帰的なグラフベースの変換をバイトストリームに使用します。プリミティブと非一時的、非静的な参照オブジェクトがストリームにエンコードされます。としてマークされていないフィールドを介してシリアル化されたオブジェクトによって参照される各オブジェクトtransientまた、シリアル化する必要があります。また、非一時的なオブジェクト参照の完全グラフ内のいずれかのオブジェクトがシリアル化できない場合、シリアル化は失敗します。開発者は、オブジェクトを一時的なものとしてマークするか、オブジェクトのシリアル化を再定義して、参照グラフの一部が切り捨てられ、シリアル化されないようにすることで、この動作に影響を与えることができます。
Javaは、オブジェクトをシリアル化するためにコンストラクターを使用しません。JDBCを介してJavaオブジェクトをシリアル化し、データベースに格納することができます。[14]スイングしながらコンポーネントはSerializableインターフェースを実装しますが、異なるバージョンのJava仮想マシン間での移植性は保証されていません。そのため、Swingコンポーネント、またはそれを継承するコンポーネントは、バイトストリームにシリアル化できますが、これが別のマシンで再構成可能であるとは限りません。
JavaScript
ECMAScript 5.1以降、[15] JavaScriptには、組み込みJSONオブジェクトとそのメソッドJSON.parse()およびが含まれていますJSON.stringify()JSONは元々JavaScriptのサブセットに基づいていますが、[16] JSONが有効なJavaScriptではないという境界のケースがあります。具体的には、JSONを使用すると、Unicodeラインターミネータ U + 2028 LINESEPARATORおよびU + 2029 PARAGRAPH SEPARATORを引用符で囲まれた文字列にエスケープせずに表示できますが、ECMAScript2018以前では使用できません。[17] [18] JSONに関するメイン記事を参照してください
ジュリア
Juliaserialize()は、 /deserialize()モジュール[19]を介してシリアル化を実装し、同じバージョンのJulia、および/または同じシステムイメージのインスタンス内で動作することを目的としています。[20]このHDF5.jlパッケージは、文書化された形式とさまざまな言語のラッパーを備えた共通ライブラリを使用する、より安定した代替手段を提供します[21]が、デフォルトのシリアル化形式は、ネットワーク通信の最大のパフォーマンスを念頭に置いて設計されていることが示唆されています。[22]
舌足らずの発音
一般に、Lispreadデータ構造は、関数 " "および ""を使用してシリアル化できますprintたとえば、配列のリストを含む変数fooは、によって出力され(print foo)ます。同様に、オブジェクトはsによってsという名前のストリームから読み取ることができます(read s)Lisp実装のこれらの2つの部分は、プリンターとリーダーと呼ばれます。""の出力printは人間が読める形式です。括弧で囲まれたリストを使用します。例:(4 2.9 "x" y)Common Lispを含む多くのタイプのLispでは、その方法が明確でないため、プリンターはすべてのタイプのデータを表現できるわけではありません。たとえば、Common Lispでは、プリンターはCLOSオブジェクトを印刷できません。代わりに、プログラマーはジェネリック関数でメソッドを書くことができますprint-object、これはオブジェクトが印刷されるときに呼び出されます。これは、Rubyで使用される方法にいくぶん似ています。Lispコード自体は、read構文と呼ばれるリーダーの構文で記述されています。ほとんどの言語は、コードとデータを処理するために別々の異なるパーサーを使用しますが、Lispは1つだけを使用します。lispコードを含むファイルは、データ構造としてメモリに読み込まれ、別のプログラムによって変換されてから、read-eval-printループなどで実行または書き出される場合があります。すべてのリーダー/ライターが循環構造、再帰構造、または共有構造をサポートしているわけではありません。
。ネットフレームワーク
.NET Frameworkには、 Microsoftによって設計されたいくつかのシリアライザーがありますサードパーティによる多くのシリアライザーもあります。ここでは、12を超えるシリアライザーについて説明し、テストしています[23]そしてここ[24]リストは絶えず増えています。
OCaml
OCamlの標準ライブラリは、Marshalモジュール[3]とPervasives関数output_valueおよびを介したマーシャリングを提供しますinput_valueOCamlプログラミングは静的に型チェックされますが、Marshalマーシャリングされていないストリームが期待される型のオブジェクトを表しているかどうかを確認する方法がないため、モジュールは型の保証を破る可能性があります。OCamlでは、関数内の実行可能コードを異なるプログラム間で送信できないため、関数または関数を含むデータ構造(メソッドを含むオブジェクトなど)をマーシャリングすることは困難です。(関数のコード位置をマーシャリングするフラグがありますが、まったく同じプログラムでのみマーシャリングを解除できます)。標準のマーシャリング関数は、共有を維持し、フラグによって構成できる循環データを処理できます。
Perl
CPANから入手できるいくつかのPerlモジュールは、、、などシリアル化メカニズムを提供ます。Storableには、Perlデータ構造をファイルまたはPerlスカラーとの間でシリアル化および逆シリアル化する関数が含まれています。ファイルに直接シリアル化することに加えて、スカラーにパックされたデータのシリアル化されたコピーを返し、そのようなスカラーを逆シリアル化する関数が含まれていますこれは、ネットワークソケットを介して複雑なデータ構造を送信したり、データベースに保存したりする場合に便利です。を使用して構造をシリアル化する場合、ネットワークセーフ機能があり、データは常に、わずかな速度で任意のコンピューターで読み取り可能な形式で保存されます。これらの関数の名前は、StorableJSON::XSFreezeThawStorablefreezethawStorablenstorenfreeze、など。これらの構造を逆シリアル化するための「n」関数はありません。「」関数でシリアル化された通常の構造体thawretrieve逆シリアル化構造体、nおよびそれらのマシン固有の同等物です。
PHP
PHPは元々、組み込み関数serialize()unserialize()関数を介してシリアル化を実装していました。[25] PHPは、リソース(ファイルポインター、ソケットなど)を除くすべてのデータ型をシリアル化できます。組み込みunserialize()関数は、完全に信頼できないデータで使用すると危険なことがよくあります。[26]オブジェクトの場合、クラス内に実装できる2つの「魔法の__sleep()メソッド」があります—および—内から__wakeup() 呼び出されます。serialize()unserialize()それぞれ、オブジェクトをクリーンアップおよび復元できます。たとえば、シリアル化時にデータベース接続を閉じ、逆シリアル化時に接続を復元することが望ましい場合があります。この機能は、これら2つの魔法の方法で処理されます。また、オブジェクトがシリアル化されるプロパティを選択できるようにします。PHP 5.1以降、オブジェクトのオブジェクト指向のシリアル化メカニズムであるSerializableインターフェースがあります。[27]
プロローグ
言語の唯一のデータ構造である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、[28] SICStus Prolog、[29] GNUPrologの対応するマニュアルページを参照してください。[30]ネットワークを介して受信したシリアル化された用語が仕様に対してチェックされるかどうか、およびどのようにチェックされるか(文字ストリームからの逆シリアル化が発生した後)は、実装者に任されます。Prologの組み込みのDefiniteClause文法は、その段階で適用できます。
Python
コアとなる一般的なシリアル化メカニズムはpickle 標準ライブラリモジュールであり、データベースシステムの用語であるピクルス[31] [32] [33]をほのめかして、データのシリアル化(逆シリアルのためのピクルス解除)を説明します。Pickleは、オブジェクトの再構築に使用される命令を記録する単純なスタックベースの仮想マシンを使用します。これは、クロスバージョンでカスタマイズ可能ですが、安全ではない(誤ったデータや悪意のあるデータに対して安全ではない)シリアル化形式です。不正な形式または悪意を持って作成されたデータにより、デシリアライザーが任意のモジュールをインポートし、任意のオブジェクトをインスタンス化する可能性があります。[34] [35]標準ライブラリには、標準データ形式にシリアル化するモジュールも含まれていますjson(基本的なスカラーおよびコレクション型のサポートが組み込まれており、エンコードおよびデコードフックを介して任意の型をサポートできます)。plistlib(バイナリとXMLの両方のプロパティリスト形式をサポートしています)。xdrlib(RFC 1014で説明されているExternal Data Representation(XDR)標準のサポート付き)。最後に、オブジェクトを__repr__適切な環境で評価できるようにして、CommonLispと大まかに一致させることをお勧めしますprint-objectすべてのオブジェクトタイプ、特にファイルハンドルなどのオペレーティングシステムリソースを保持するオブジェクトタイプを自動的に選択できるわけではありません。、ただし、ユーザーはカスタムの「削減」および構築関数を登録して、任意のタイプのピクルスおよびピクルス解除をサポートできます。Pickleは元々純粋なPythonpickleモジュールとして実装されていましたが、3.0より前のバージョンのPythonでは、cPickleモジュール(これも組み込み)によってパフォーマンスが向上します(最大1000倍高速[34])。UnladenSwallowプロジェクトcPickleから採用されましPython 3では、ユーザーは常に標準バージョンをインポートする必要があります。標準バージョンは、高速化されたバージョンをインポートしようとし、純粋なPythonバージョンにフォールバックします。[36]
R
Rdputには、RオブジェクトのASCIIテキスト表現をファイルまたは接続に書き込む機能があります。表現は、を使用してファイルから読み取ることができますdget[37]より具体的には、関数serializeはRオブジェクトを接続にシリアル化し、出力は16進形式でコード化された生のベクトルです。このunserialize関数を使用すると、接続または生のベクトルからオブジェクトを読み取ることができます。[38]
REBOL
REBOLは、ファイル(save/all)またはstring!( )にシリアル化しますmold/all文字列とファイルは、ポリモーフィック 関数を使用して逆シリアル化できますloadプロトコルバッファRProtoBufを使用して、Rで言語間のデータシリアル化を提供します[39]
ルビー
Rubyには、標準のUnixユーティリティとに似たMarshal2つのメソッドdumpとを備えた標準モジュールが含まれていますこれらのメソッドは標準クラスにシリアル化されます。つまり、これらのメソッドは事実上バイトのシーケンスになります。一部のオブジェクトはシリアル化できません(そうすると例外が発生します):バインディング、プロシージャオブジェクト、クラスIOのインスタンス、シングルトンオブジェクトおよびインターフェイス。クラスにカスタムシリアル化が必要な場合(たとえば、ダンプ/復元時に実行される特定のクリーンアップアクションが必要な場合)、次の2つのメソッドを実装することで実行できますインスタンスメソッドは、loaddumprestoreStringTypeError_dump_load_dumpStringこのクラスのオブジェクトと、整数パラメーターとして指定された最大深度までのすべての参照オブジェクトを再構成するために必要なすべての情報を含むオブジェクト(値-1は、深度チェックを無効にする必要があることを意味します)。クラスメソッド_loadは、を取り、Stringこのクラスのオブジェクトを返す必要があります。
さび
SerdeRustでのシリアル化に最も広く使用されているライブラリまたはクレートです。
Smalltalk
一般に、非再帰的で非共有のオブジェクトは、storeOn:/readFrom:プロトコルを使用して人間が読める形式で保存および取得できます。このstoreOn:メソッドは、Smalltalk式のテキストを生成します。readFrom:-元のオブジェクトを再作成します。このスキームは、データ自体ではなく、オブジェクトの手続き型記述を使用するという点で特別です。したがって、非常に柔軟性があり、クラスがよりコンパクトな表現を定義できるようになります。ただし、元の形式では、循環データ構造を処理したり、共有参照のIDを保持したりしません(つまり、1つのオブジェクトの2つの参照は、2つの等しいが同一ではないコピーへの参照として復元されます)。このために、さまざまなポータブルおよび非ポータブルの代替手段が存在します。それらのいくつかは、特定のSmalltalk実装またはクラスライブラリに固有のものです。Squeak Smalltalkには、オブジェクトをシリアル化して保存する方法がいくつかあります。最も簡単で最もよく使用されるのはstoreOn:/readFrom:、に基づくバイナリストレージ形式です。SmartRefStreamシリアライザー。さらに、バンドルされたオブジェクトは、を使用して保存および取得できます。ImageSegmentsどちらも、コンパクトなバイナリ形式へのシリアル化とそこからの取得をサポートする、いわゆる「バイナリオブジェクトストレージフレームワーク」を提供します。どちらも、循環構造、再帰構造、共有構造、クラスおよびメタクラス情報の保存/取得を処理し、「オンザフライ」オブジェクト移行(つまり、オブジェクトレイアウトが異なる古いバージョンのクラスによって作成されたインスタンスを変換する)のメカニズムを備えています。APIは似ていますが(storeBinary / readBinary)、エンコーディングの詳細が異なるため、これら2つの形式には互換性がありません。ただし、Smalltalk / Xコードはオープンソースで無料であり、他のSmalltalkにロードして、方言間のオブジェクト交換を可能にすることができます。オブジェクトのシリアル化は、ANSISmalltalk仕様の一部ではありません。その結果、オブジェクトをシリアル化するためのコードは、Smalltalkの実装によって異なります。結果のバイナリデータも異なります。たとえば、Squeak Smalltalkで作成されたシリアル化されたオブジェクトは、AmbraiSmalltalkその結果、オブジェクトのシリアル化に依存する複数のSmalltalk実装で動作するさまざまなアプリケーションは、これらの異なる実装間でデータを共有できません。これらのアプリケーションには、MinneStoreオブジェクトデータベース[40]および一部のRPCパッケージが含まれます。この問題の解決策は、SIXXの「 What'snew」です。SIXX-XMLでのSmalltalkインスタンスの交換2010年1月23日2021年7月25日取得</ ref>は、シリアル化にXMLベースの形式を使用する複数のSmalltalkのパッケージです。
迅速
Swift標準ライブラリは、2つのプロトコルEncodableDecodable(として一緒に構成された)を提供します。これにより、準拠する型のインスタンスをJSONプロパティリスト、またはその他の形式にCodableシリアル化または逆シリアル化できます。[41]これらのプロトコルのデフォルトの実装は、格納されているプロパティがまたはである型に対してコンパイラによって生成できますDecodableEncodable
Windows PowerShell
Windows PowerShellは、組み込みのコマンドレットを介してシリアル化を実装しExport-CliXMLます。Export-CliXML.NETオブジェクトをシリアル化し、結果のXMLをファイルに保存します。オブジェクトを再構成するには、Import-CliXMLコマンドレットを使用します。このコマンドレットは、エクスポートされたファイルのXMLから逆シリアル化されたオブジェクトを生成します。「プロパティバッグ」としてよく知られている逆シリアル化されたオブジェクトは、ライブオブジェクトではありません。これらはプロパティを持つスナップショットですが、メソッドはありません。2次元データ構造は、組み込みのコマンドレットとを使用して、 CSV形式で(逆)シリアル化することもできますImport-CSVExport-CSV

も参照してください

参考文献

  1. ^ クライン、マーシャル。「C ++ FAQ:「この「シリアル化」とは何ですか?」"。2015年4月5日にオリジナルからアーカイブされましたオブジェクトまたはオブジェクトのグループを取得し、ディスクに配置するか、有線または無線のトランスポートメカニズムを介して送信し、後で、おそらく別のコンピューターで、プロセス、元のオブジェクトを復活させます。基本的なメカニズムは、オブジェクトを1次元のビットのストリームに平坦化し、そのビットのストリームを元のオブジェクトに戻すことです。
  2. ^ 「モジュール:元帥(Ruby 3.0.2)」ruby-doc.org 2021年7月25日取得
  3. ^ a b "元帥"OCaml 2021年7月25日取得
  4. ^ 「Python3.9.6ドキュメント-Pythonオブジェクトのシリアル化—pickle」ドキュメント-Python標準ライブラリ
  5. ^ S.ミラー、マーク。「相互疑惑の下での安全なシリアル化」ERights.org以下で説明するシリアル化は、オブジェクトシステム内のオブジェクトが埋め込まれたグラフを操作するために使用するツールの例です。これには、純粋なオブジェクトモデルによって提供されるカプセル化に違反する必要があるようです。
  6. ^ サンマイクロシステムズ(1987)。「XDR:外部データ表現標準」RFC1014ネットワークワーキンググループ2011年7月11日取得
  7. ^ 「シリアル化」www.boost.org
  8. ^ ビール、ステファン。"s11n.net:C++でのオブジェクトのシリアル化/永続化"s11n.net
  9. ^ 「シリアルドキュメント-メイン」uscilab.github.io
  10. ^ 「パッケージエンコーディング」pkg.go.dev2021年7月12日。
  11. ^ 「GitHub-Go言語のYAMLサポート」GitHub 2021年7月25日取得
  12. ^ "proto・pkg.go.dev"pkg.go.dev 2021-06-22を取得
  13. ^ 「Text.ShowDocumentation」2014年1月15日取得
  14. ^ 「TOMに「Javaオブジェクトをデータベースにシリアル化する(そしてge ...」」と尋ねる" 。asktom.oracle.com_
  15. ^ 「JSON」MDN WebDocs 2018年3月22日取得
  16. ^ 「JSON」www.json.org 2018年3月22日取得
  17. ^ ホルム、マグナス(2011年5月15日)。「JSON:そうではないJavaScriptサブセット」時代を超越したリポジトリ2016年9月23日取得
  18. ^ 「TC39提案:JSONを含める」ECMATC39委員会。2018年5月22日。
  19. ^ 「シリアル化」ジュリア言語2021年7月25日取得
  20. ^ 「記号と文字列のより高速でコンパクトなシリアル化・JuliaLang / julia @ bb67ff2」GitHub
  21. ^ 「HDF5.jl:HDF5ファイル形式でのデータの保存と読み込み」2017年8月20日–GitHub経由。
  22. ^ 「ジュリア:serialize()/ deserialize()の安定性」stackoverflow.com2014年。
  23. ^ 「。NETシリアライザー」シリアライザーには多くの種類があります。それらは非常にコンパクトなデータを非常に高速に生成します。メッセージング、データストア、オブジェクトのマーシャリング用のシリアライザーがあります。.NETで最高のシリアライザーは何ですか?
  24. ^ 「aumcodeによるSERBENCH」aumcode.github.io
  25. ^ 「PHP:オブジェクトのシリアル化-手動」ca.php.net
  26. ^ エッサー、スティーブン(2009-11-28)。「PHPエクスプロイトの衝撃的なニュース」Suspekt ..。2012年1月6日にオリジナルからアーカイブされまし
  27. ^ 「PHP:シリアル化可能-手動」www.php.net
  28. ^ "「用語の読み書き」"。www.swi -prolog.org
  29. ^ ""write_term / [2,3]"" 。sicstus.sics.se_
  30. ^ "「用語入出力」" 。gprolog.org_
  31. ^ ハーリヒー、モーリス; リスコフ、バーバラ(1982年10月)。「抽象データ型の値の伝達方法」(PDF)プログラミング言語とシステムに関するACMトランザクション4(4):527–551。CiteSeerX10.1.1.87.5301_ 土井10.1145 /69622.357182ISSN0164-0925_ OCLC67989840_ S2CID8126961_     
  32. ^ Birrell、Andrew; ジョーンズ、マイク; ウォバー、テッド(1987年11月)。「小さなデータベースのためのシンプルで効率的な実装」。ACM SIGOPSオペレーティングシステムレビュー:オペレーティングシステムの原則に関する第11回ACMシンポジウムの議事録11(5):149–154。CiteSeerX10.1.1.100.1457_ 土井10.1145 /41457.37517ISSN0163-5980_ OCLC476062921_ S2CID12908261_    私たちの実装では、「ピクルス」と呼ばれるメカニズムを利用します。このメカニズムは、強く型付けされたデータ構造と、永続ディスクファイルに格納するのに適したその構造の表現との間で変換を行います。Pickle.Write操作は、厳密に型指定されたデータ構造へのポインターを受け取り、ディスクに書き込むためのビットのバッファーを提供します。逆に、Pickle.Readはディスクからビットのバッファを読み取り、元のデータ構造のコピーを配信します。(*)この変換には、構造内のアドレスの出現を識別し、構造がディスクから読み戻されるときにアドレスが現在の実行環境で有効なアドレスに置き換えられます。ピクルスメカニズムは完全に自動化されています。これは、ガベージコレクションメカニズムに存在する実行時の型指定構造によって駆動されます。..。(*)ピクルスは、リモートプロシージャコールでのマーシャリングの概念と非常によく似ています。しかし実際、私たちのピッキング実装は、実行時に動的に型付けされた値の構造を解釈することによってのみ機能しますが、RPC実装は、静的に型付けされた値をマーシャリングするためのコードを生成することによってのみ機能します。各施設は、他の施設のメカニズムを追加することで恩恵を受けるでしょうが、それはまだ行われていません。
  33. ^ ヴァンロッサム、グイド(1994年12月1日)。「Pythonオブジェクトのフラット化」Pythonプログラミング言語–レガシーWebサイトデラウェア州、アメリカ合衆国:Python SoftwareFoundation 2017年4月6日取得「フラット化」という名前の由来:元の「マーシャル」モジュールをそのままにしておきたいので、ジムは「シリアル化」は永続オブジェクトへの同時アクセスのコンテキストに実際に関連するまったく異なるものも意味すると不満を述べました。これからは「平坦化」という用語。...(Modula-3システムは、この概念に「ピクルス」データという用語を使用しています。おそらく、すでにすべての問題を解決しています。
  34. ^ a b "11.1。pickle— Pythonオブジェクトのシリアル化— Python2.7.14rc1ドキュメント"docs.python.org
  35. ^ 「pickle— Pythonオブジェクトのシリアル化— Pythonv3.0.1ドキュメント」docs.python.org
  36. ^ 「Python3.0の新機能— Pythonv3.1.5ドキュメント」docs.python.org
  37. ^ [Rマニュアルhttp://stat.ethz.ch/R-manual/R-patched/library/base/html/dput.html ]
  38. ^ [Rマニュアルhttp://stat.ethz.ch/R-manual/R-patched/library/base/html/serialize.html ]
  39. ^ Eddelbuettel、Dirk; ストークリー、マレー; Ooms、Jeroen(2014)。「RProtoBuf:Rでの効率的な言語間データのシリアル化」。統計ソフトウェアジャーナル71(2)。arXiv1401.7372土井10.18637 /jss.v071.i02S2CID36239952_ 
  40. ^ 「MinneStoreバージョン2」SourceForge2005年5月11日にオリジナルからアーカイブされました。
  41. ^ 「SwiftArchival&Serialization」www.github.com2018-12-02。

外部リンク