シリアル化

フリー百科事典ウィキペディアより

コンピューティングでは、シリアライゼーション(またはシリアライゼーション) は、データ構造またはオブジェクトの状態を、格納 (例:セカンダリ ストレージ デバイスの ファイル、プライマリ ストレージ デバイスのデータ バッファー) または送信 (例:コンピュータ ネットワーク上のデータ ストリーム)できる形式に変換するプロセスです。) 後で再構築します (別のコンピューター環境で可能性があります)。[1]結果の一連のビットがシリアライゼーション形式に従って再読み取りされると、元のオブジェクトの意味的に同一のクローンを作成するために使用できます。参照を多用するオブジェクトなど、多くの複雑なオブジェクトの場合、このプロセスは簡単ではありません。オブジェクト指向オブジェクトのシリアル化には、以前にリンクされていた 関連メソッドは含まれません。

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

編集

方法:

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

データのエンコードは定義上シリアルであるため、シリアル化されたデータ構造の一部を抽出するには、オブジェクト全体を最初から最後まで読み取って再構築する必要があります。多くのアプリケーションでは、この線形性は資産です。単純で共通の 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 はオープン フォーマットです。

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

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

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

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

C および C++
CC++ は、あらゆる種類の高レベル構造としてシリアライゼーションを提供しませんが、どちらの言語も、バイナリ データとしての組み込みデータ型単純な古いデータ 構造体の書き込みをサポートしています。そのため、通常、カスタムのシリアライゼーション関数を書くのは簡単です。さらに、 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 SerializableExternalizable
オブジェクトがデフォルトで直列化可能ではなく、SerializableJava の直列化メカニズムにアクセスするためのインターフェースを実装する必要がある主な理由は 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_valueOCaml プログラミングは静的に型チェックされますが、Marshalマーシャリングされていないストリームが期待される型のオブジェクトを表しているかどうかを確認する方法がないため、モジュールは型の保証を破る可能性があります。OCaml では、関数または関数を含むデータ構造 (メソッドを含むオブジェクトなど) をマーシャリングすることは困難です。これは、関数内の実行可能コードを異なるプログラム間で転送できないためです。(関数のコード位置をマーシャリングするためのフラグがありますが、まったく同じプログラムでしかアンマーシャリングできません)。標準のマーシャリング関数は、共有を維持し、フラグによって構成できる循環データを処理できます。
パール
CPANから入手できるいくつかのPerlモジュールは、 、 、およびを含むシリアライゼーション メカニズムを提供しますStorable には、Perl データ構造をファイルまたは Perl スカラーとの間でシリアライズおよびデシリアライズする関数が含まれています。ファイルへの直接のシリアル化に加えて、スカラーにパックされたデータのシリアル化されたコピーを返し、そのようなスカラーを逆シリアル化する関数が含まれています。これは、複雑なデータ構造をネットワーク ソケット経由で送信したり、データベースに格納したりする場合に便利です。を使用して構造体をシリアル化する場合、データを常に任意のコンピューターで読み取り可能な形式で保存するネットワーク セーフ関数があり、速度はわずかに低下します。これらの関数の名前はStorableJSON::XSFreezeThawStorablefreezethawStorablenstorenfreezeなど。これらの構造を逆シリアル化するための "n" 関数はありません — " " 関数およびそれらのマシン固有の等価物でシリアル化された通常の逆シリアル化thaw構造retrieven
PHP
PHP は元々、ビルトイン関数serialize()unserialize()関数を介してシリアライゼーションを実装していました。[26] PHP は、リソース (ファイル ポインター、ソケットなど) を除くすべてのデータ型をシリアル化できます。組み込みunserialize()関数は、完全に信頼できないデータに対して使用すると危険な場合がよくあります。[27]オブジェクトの場合、クラス内で実装できる2 つの「魔法のメソッド」があり__sleep()__wakeup() クラス内から呼び出されますserialize()unserialize()、それぞれ、オブジェクトをクリーンアップおよび復元できます。たとえば、シリアライゼーションでデータベース接続を閉じ、デシリアライゼーションで接続を復元することが望ましい場合があります。この機能は、これら 2 つのマジック メソッドで処理されます。また、シリアル化されるプロパティをオブジェクトが選択できるようにします。PHP 5.1 以降、オブジェクトのオブジェクト指向シリアル化メカニズムであるインターフェースがありますSerializable[28]
プロローグ
言語の唯一のデータ構造であるPrologterm構造は、組み込み述語を介してシリアル化されwrite_term/3、組み込み述語read/1andを介してシリアル化されます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 できるわけではありません。特に、ファイル ハンドルなどのオペレーティング システムリソースを保持するものはそうです。plistlibxdrlib__repr__print-objectですが、ユーザーはカスタムの「リダクション」関数と構築関数を登録して、任意の型の酸洗いと酸洗い解除をサポートできます。Pickle はもともと純粋な Pythonpickleモジュールとして実装されていましたが、3.0 より前のバージョンの Python では、cPickleモジュール (これも組み込み) のパフォーマンスが向上しています (最大 1000 倍高速[35] )。Unladen SwallowcPickleプロジェクトから改作されましPython 3 では、ユーザーは常に標準バージョンをインポートする必要があります。標準バージョンは高速バージョンをインポートしようとし、純粋な Python バージョンにフォールバックします。[37]
R
Rdputには、R オブジェクトの ASCII テキスト表現をファイルまたは接続に書き込む関数があります。を使用してファイルから表現を読み取ることができますdget[38]より具体的には、関数はserializeR オブジェクトを接続にシリアル化し、出力は 16 進数形式でコード化された生のベクトルです。このunserialize関数を使用すると、接続または生のベクトルからオブジェクトを読み取ることができます。[39]
リボル
REBOL はsave/allファイル ( ) またはstring!( )にシリアライズしますmold/all文字列とファイルは、ポリモーフィック load関数を使用して逆シリアル化できます。Protocol Buffers をRProtoBuf使用して、R で言語間データのシリアル化を提供します[40]
ルビー
Ruby には、標準の Unix ユーティリティとに似た、と のMarshal2 つのメソッドを持つ標準モジュールが含まれていますこれらのメソッドは、標準クラスにシリアライズされます。つまり、実質的に一連のバイトになります。一部のオブジェクトはシリアル化できません (シリアル化すると例外が発生します): バインド、プロシージャ オブジェクト、クラス IO のインスタンス、シングルトン オブジェクト、およびインターフェイス。クラスでカスタムのシリアル化が必要な場合 (たとえば、ダンプ/復元時に特定のクリーンアップ アクションを実行する必要がある場合)、と の2 つのメソッドを実装することで実行できますインスタンス メソッドdumploaddumprestoreStringTypeError_dump_load_dumpStringこのクラスのオブジェクトと参照されるすべてのオブジェクトを再構成するために必要なすべての情報を、整数パラメーターとして指定された最大深度まで含むオブジェクト (値 -1 は、深度チェックを無効にする必要があることを意味します)。クラス メソッドは_loadを取りString、このクラスのオブジェクトを返す必要があります。
さび
SerdeRustでのシリアル化に最も広く使用されているライブラリまたはクレートです
スモールトーク
一般に、非再帰的および非共有オブジェクトは、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]これらのプロトコルのデフォルトの実装は、格納されたプロパティがまたは である型に対してコンパイラによって生成できますEncodableDecodableCodableDecodableEncodable
Windows PowerShell
Windows PowerShell は、組み込みのコマンドレットを介してシリアル化を実装しますExport-CliXMLExport-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. ^ 「Python 3.9.6 ドキュメント - Python オブジェクトのシリアル化 —pickle」 . ドキュメント - Python 標準ライブラリ.
  5. ^ S. ミラー、マーク。「相互疑いの下での安全なシリアル化」 . Eライツ.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. ^ "プロト・pkg.go.dev" . pkg.go.dev 2021年6月22日閲覧
  13. ^ "gob パッケージ - encoding/gob - pkg.go.dev" . pkg.go.dev 2022 年 3 月 4 日閲覧
  14. ^ "Text.Show ドキュメンテーション" . 2014 年1 月 15 日閲覧
  15. ^ 「TOM に尋ねる」「データベースへの Java オブジェクトのシリアル化 (および ge...」" .asktom.oracle.com . _
  16. ^ "JSON" . MDN Web ドキュメント. 2018 年3 月 22 日閲覧
  17. ^ "JSON" . www.json.org 2018 年3 月 22 日閲覧
  18. ^ ホルム、マグナス (2011 年 5 月 15 日). 「JSON: そうでない JavaScript サブセット」 . 時代を超越したリポジトリ2016 年9 月 23 日閲覧
  19. ^ "TC39 提案: JSON を含める" . ECMA TC39 委員会。2018 年 5 月 22 日。
  20. ^ 「連載」 . ジュリア言語2021年7月25日閲覧
  21. ^ "シンボルと文字列のより高速でコンパクトなシリアル化 · JuliaLang/[email protected]" . GitHub .
  22. ^ "HDF5.jl: HDF5 ファイル形式でのデータの保存と読み込み" . 2017 年 8 月 20 日 – GitHub 経由。
  23. ^ "Julia: serialize() / deserialize() の安定性" . stackoverflow.com2014年。
  24. ^ ".NET シリアライザー" . 多くの種類のシリアライザーがあります。非常にコンパクトなデータを非常に高速に生成します。メッセージング用、データ ストア用、オブジェクトのマーシャリング用のシリアライザがあります。.NET で最高のシリアライザーは何ですか?
  25. ^ "aumcodeによるSERBENCH" . aumcode.github.io .
  26. ^ "PHP: オブジェクトのシリアル化 - マニュアル" . ca.php.net
  27. ^ エッサー、スティーブン (2009-11-28). 「PHP エクスプロイトのショッキング ニュース」 . 容疑者.. 2012-01-06 のオリジナルからのアーカイブ
  28. ^ "PHP: シリアライズ可能 - マニュアル" . www.php.net
  29. ^ "「用語の読み書き」" . www.swi-prolog.org .
  30. ^ ""write_term/[2,3]"" .sicstus.sics.se . _
  31. ^ "「項入出力」" .gprolog.org . _
  32. ^ Herlihy、モーリス; Liskov、バーバラ(1982 年 10 月)。「抽象データ型の値の送信方法」(PDF) . プログラミング言語とシステムに関する ACM トランザクション4 (4): 527–551。CiteSeerX 10.1.1.87.5301 . ドイ: 10.1145/69622.357182 . ISSN 0164-0925 . OCLC 67989840S2CID 8126961 .     
  33. ^ ビレル、アンドリュー; ジョーンズ、マイク。ウォバー、テッド (1987 年 11 月)。「小規模データベースのシンプルで効率的な実装」. ACM SIGOPS オペレーティング システムのレビュー: オペレーティング システムの原則に関する第 11 回 ACM シンポジウムの議事録11 (5): 149–154. CiteSeerX 10.1.1.100.1457 . ドイ: 10.1145/41457.37517 . ISSN 0163-5980OCLC 476062921S2CID 12908261 .    私たちの実装では、"pickles" と呼ばれるメカニズムを利用しています。このメカニズムは、厳密に型指定されたデータ構造と、永続的なディスク ファイルに格納するのに適した構造の表現との間で変換を行います。操作 Pickle.Write は、厳密に型指定されたデータ構造へのポインターを受け取り、ディスクに書き込むためのビットのバッファーを提供します。逆に、Pickle.Read はディスクからビットのバッファを読み取り、元のデータ構造のコピーを配信します。(*) この変換には、構造内のアドレスの出現を識別し、構造がディスクから読み戻されるときにアドレスが現在の実行環境で有効なアドレスに置き換えられます。pickle メカニズムは完全に自動化されています。これは、ガベージ コレクション メカニズムに存在するランタイム型付け構造によって駆動されます。... (*) pickling は、リモート プロシージャ コールでのマーシャリングの概念に非常に似ています。しかし実際には、ピクルス化の実装は動的に型付けされた値の構造を実行時に解釈することによってのみ機能しますが、RPC 実装は静的に型付けされた値のマーシャリング用のコードを生成することによってのみ機能します。各施設は、他のメカニズムを追加することで利益を得ることができますが、それはまだ行われていません。
  34. ^ van Rossum、Guido (1994 年 12 月 1 日)。「Python オブジェクトのフラット化」 . Python プログラミング言語 – 従来の Web サイト. 米国デラウェア州: Python Software Foundation 2017年4月6日閲覧'flattening' という名前の由来: 元の 'marshal' モジュールをそのままにしておきたいので、Jim は 'serialization' も永続オブジェクトへの同時アクセスのコンテキストで実際に関連するまったく別のものを意味すると不平を言ったので、私は使用しますこれからは「平坦化」という言葉。... (Modula-3 システムでは、この概念に「ピクルス化」データという用語を使用しています。おそらく、すべての問題は既に解決されていますが、
  35. ^ a b "11.1. pickle — Python オブジェクトのシリアル化 — Python 2.7.14rc1 ドキュメント" . docs.python.org .
  36. ^ "pickle — Python オブジェクトのシリアル化 — Python v3.0.1 ドキュメント" . docs.python.org .
  37. ^ 「Python 3.0 の新機能 — Python v3.1.5 ドキュメント」 . 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、ダーク。ストークリー、マレー。Ooms、Jeroen (2014)。「RProtoBuf: R での効率的なクロスランゲージ データ シリアライゼーション」. 統計ソフトウェアのジャーナル71 (2)。arXiv : 1401.7372 . ドイ: 10.18637/jss.v071.i02 . S2CID 36239952 . 
  41. ^ 「ミネストア バージョン2」 . ソースフォージ2005 年 5 月 11 日にオリジナルからアーカイブされました
  42. ^ 「新機能」 . SIXX - XML での Smalltalk インスタンス交換2010 年 1 月 23 日2021年7月25日閲覧
  43. ^ 「Swift のアーカイブとシリアル化」 . www.github.com2018-12-02.

外部リンク