2

.NET フレームワークには、メソッド呼び出しによって Stream が返される例がたくさんあります。この Stream を必要に応じて読み込んで実装できます。しかし、これは裏でどのように機能するのでしょうか? ストリームを支えるものは何ですか?

いくつかの入力を取り、いくつかのデータを事前定義された形式に解析するパーサーを書いているとします。たとえば、MemoryStream を作成し、StreamWriter を使用してコンテンツを書き込み、メソッドがストリームを返すようにした場合、ライターは完了時に基になるストリームを閉じ、呼び出し元はアクセスできないため、問題が発生します。期待通りに読むために。

これは通常どのように管理されますか? ストリームのコンテンツは、必要になるまでオブジェクトに格納され (のようにbyte[])、ストリームを要求するメソッドが呼び出されると、その時点で作成されますか?

4

3 に答える 3

5

ストリームは、ファイル、入出力デバイス、プロセス間通信パイプ、TCP/IP ソケットなどの一連のバイトを抽象化したものです。Stream クラスとその派生クラスは、これらのさまざまな種類の入力と出力の一般的なビューを提供し、プログラマーをオペレーティング システムと基盤となるデバイスの特定の詳細から切り離します。[MSDN によると]

したがって、ストリームを使用して.NETでさまざまな形式を使用するシリアル化のために、 serialize を使用していると思います。要求を定義する必要があります

シリアライゼーションとは、永続ストレージのためにオブジェクトをバイトに変換するプロセスです。逆シリアル化プロセスでは、データを失うことなくバイトをオブジェクトに変換します。シリアライゼーションは、ファイルまたはデータベースに値を保存したり、ネットワーク経由でオブジェクトを送信したり、元のオブジェクト形式に変換したりするために使用されます。.NET Framework は、シリアル化プロセスを容易にするためのフレームワーク クラス ライブラリ (FCL) のセットを提供します。2 つの異なるアプリケーション間でデータを送信する場合に非常に便利です。

.NET Framework は、バイナリ シリアル化と XML シリアル化の形式をサポートしています。XML シリアル化は、パブリック フィールドのみをシリアル化します。ただし、バイナリ シリアル化では、すべてのプライベート フィールドとパブリック フィールドがシリアル化されます。シリアル化は、基本またはカスタムとして実行できます。基本的なシリアル化は、クラスに SerializableAttribute 属性が適用されている場合に発生します。基本的なシリアル化は、バージョン管理をサポートしていません。カスタム シリアル化クラスは、SerializableAttribute とマークされ、ISerializable インターフェイスを実装する必要があります。ユーザーは、バイナリおよび XML シリアライゼーション形式の両方にカスタム シリアライゼーションを実装できます。カスタム アプリケーションでは、GetObjectData をオーバーライドする必要があります。サンプル アプリケーションでは、バイナリ シリアル化と XML シリアル化の両方にカスタム シリアル化を使用します。.NET Framework は、開発ツールに関連付けられているデザイナーのシリアル化をサポートしています。

カスタム シリアライゼーションは、シリアライゼーションおよびデシリアライゼーション プロセスを制御するプロセスです。カスタム シリアル化は、シリアル化中およびシリアル化後にカスタム メソッドを実行するか、ISerializable インターフェイスを実装することによって実装できます。カスタム シリアル化は、シリアル化オブジェクトのバージョン管理に使用されます。シリアル化されたオブジェクトがオブジェクトの状態を変更した場合 (新しいバージョンで新しいファイルが追加された場合)、データを失うことなく値を取得するためにカスタム シリアル化が使用されます。属性が欠落しているために、シリアル化されたオブジェクトのバージョン管理が失敗する場合があります。

ユーザーがシリアル化中およびシリアル化後にカスタム メソッドを使用する場合、ユーザーは、シリアル化および逆シリアル化中にデータをカスタマイズするために、OnDeserializedAttribute、OnDeserializingAttribute、OnSerializedAttribute、および OnSerializingAttribute 属性を使用してカスタム シリアル化サポートを適用する必要があります。OptionalFieldAttribute 属性は、逆シリアル化のために古いバージョンのデータを無視するために使用されます。フォーマッターは、逆シリアル化中にエラーを出しません。シリアライゼーション/デシリアライゼーションの前後にオブジェクトを更新できます。

以下のリンクが役立つと思います
http://www.codeproject.com/Articles/422474/Serialization-using-different-formats-in-NET

于 2013-03-07T19:45:01.460 に答える
2

ストリームは、さまざまなものに支えられています。これが、 Stream抽象基本クラスから派生するストリームの全体的な考え方です。

Streamストリームは、OS レベルのファイル ストリーム、メモリ、HTTP 接続、またはコントラクトを満たすことができるその他の要素によってサポートされます。

の場合MemoryStream、バッキング ストレージは単なるメモリ ブロックです。

の場合、そのStreamWriter上で Dispose() を呼び出すと、基になるストリームが閉じられます。ストリームを使用したい限り、ライターを破棄しないでください。MemoryStreamまた、書き込み後に再度アクセスしたい場合は、必ず位置を先頭に設定してください。

memStream.Seek(0, SeekOrigin.Begin);
于 2013-03-07T19:09:46.377 に答える
1

StreamWriter には、ストリームを閉じないように書き込みを指示するために使用できるオーバーロードされたコンストラクターがあります。

また、Stream には、StreamWriter を完全に回避できる .WriteBytes メソッドが必要です。

于 2013-03-07T19:10:29.250 に答える