2

Ok。シリアル化などの使用方法は知っていますが、それはシリアル化属性でマークされたオブジェクトにのみ適用されるため、たとえば、データをロードして、シリアル化を使用せずにアプリケーションで使用するにはどうすればよいですか?データファイルを言います。

または、シリアル化されていないファイルを保持するシリアル化されたデータコンテナを作成します。

私が使用した方法は、バイナリシリアル化とXMLシリアル化です。未知のデータをロードし、おそらくそれをC#で使用できる他の方法はありますか?

4

3 に答える 3

3

おそらく、用語の定義は適切です。シリアライゼーションとは、「データ構造またはオブジェクトの状態を、後で同じまたは別のコンピューター環境に保存して「復元」できる形式に変換するプロセス」です。「揮発性」メモリを永続データに変換して元に戻す方法はほとんどすべて「シリアル化」であるため、独自のスキームをロールしてそれを実行しても、「シリアル化」しています。

そうは言っても、.NET バイナリ シリアル化を使用したくないだけのようです。それは実際には正しい考えです。バイナリのシリアル化は単純ですが、コードと環境に大きく依存します。シリアル化可能なクラスを別の名前空間に移動するか、Microsoft CLR を使用してファイルをシリアル化し、Mono で逆シリアル化しようとすると、バイナリのシリアル化が中断される可能性があります。

何よりもまず、ファイルに基づいて作成しようとするオブジェクトのタイプを決定できなければなりません。ファイル内でデータがどのように構造化されているかを知らずに、「ランダムな」ファイルを開いて、意味のあるものを取得できると期待することはできません。最も簡単な方法は、ファイルが作成されたオブジェクトの型名を指定することによって、ファイルがあなたに伝えることです (コードベースで利用できるようにすることをお勧めします)。ほとんどの組み込みシリアライザーは、この方法でそれを行います。ファイルがコンシューマーにその形式を通知できるその他の方法には、ファイル、行および/またはフィールド ヘッダー コード (ファイル サイズを節約するため、古い標準では非常に一般的) および拡張子/MIME タイプが含まれます。

それが整理されると、逆シリアル化が行われます。ファイルが組み込みのシリアライザーを使用してシリアライズされた場合は、単純にそれを使用しますが、それが古い形式 (CSV、固定長) の場合は、ファイルを 1 行ずつ解析して、行を表すオブジェクトに変換する必要があります。ファイルを表すメイン オブジェクト。

ETL (Extract-Transform-Load) プロセス パターンをご覧ください。これは、ファイルを取得して、プログラムが操作できるデータに変換するための、モジュラーでスケーラブルなアーキテクチャ パターンです。

  • 抽出 - システムのこの部分は、ファイルシステム、または生データ用のその他の受信「パイプ」を指しており、その仕事は、ファイルを開き、データをさらに操作できる非常に基本的なオブジェクト形式に抽出し、それらを配置することです。オブジェクトを変換ステップのメモリ内「キュー」に入れます。目標は、パイプからできるだけ速く効率的にデータを取得することですが、この時点では、さらに処理するためにデータを効果的にカプセル化できるように、処理しているデータについてある程度の知識が必要です。実際にデータを本当に必要な形式に変換するのは後で行います。
  • 変換 - システムのこの部分は、抽出されたデータを取得し、そのデータをコードベースから水和オブジェクトに入れるロジックを実行します。ここで、データが抽出されたファイルのタイプに関する抽出ステップからの情報を使用して、データ モデルを表すドメイン オブジェクトをインスタンス化し、生データをデータ メンバーとして格納されるチャンクにスライスし、任意の処理を実行します。型変換 (ファイルから取得するデータは、通常、文字列形式または raw ビットのいずれかであり、データの概念をより適切に表すデータ型にマーシャリングするか、別の方法で変換する必要があります)、および新しいオブジェクトの内部構造が一貫性があり、既知のビジネス ルールを満たしています。ハイドレートされた有効なオブジェクトは、出力キューに配置され、ロード ステップで処理されます。
  • ロード - このステップでは、ハイドレートされた有効なビジネス オブジェクトを変換ステップから取得し、システムで使用されるデータ ストア (SQL データベースやプログラムのネイティブ フラット ファイル形式など) に永続化します。
于 2012-07-17T15:59:04.300 に答える
3

JSON.NETを使用した JSON シリアル化

これは全部食べます!匿名型を含む。

編集

「シリアライゼーションを望まない」と言ったことは知っていますが、「[...]シリアライゼーション属性でマークされたオブジェクト」という声明に基づいて、JSON.NETを使用してJSONシリアライゼーションを試みなかったと思います!

于 2012-07-17T15:29:45.817 に答える
0

昔ながらの方法は、ストリーム アクセス操作を使用して、必要なデータを読み取ることでした。このようにして、ほとんどすべてのファイルを読み書きできます。シリアル化は、何らかの契約に基づいてこのプロセスを単純に自動化します。

あなたのコメントに基づいて、あなたの要件は、そもそも契約なしであらゆる種類のファイルを読み取ることであると推測しています。

文字列の長さを指定する最初のバイトと、文字列を表す次のバイト セットを含む raw ファイルがあるとします。

例えば、5 | H | e | l | l | o

var stream = File.Open(filename);
var length = stream.ReadByte();
byte[] b = new byte[length];

stream.Read(b, 0, length);

var string = Encoding.ASCII.GetString(b);

バイナリ I/O は生のままです。 詳細については、MSDN を確認してください。

于 2012-07-17T15:40:22.127 に答える