順序付けられた量のバイトを別の「もの」に送信したいときはいつでも、送信されたのと同じ順序でバイトを解釈する必要がある場合は、System.IO.Stream クラスを使用するのが賢明です。
このクラスを使用して、順序が同じである限り、バイトがどこに行くかはあまり気にしないことを宣言します。したがって、バイトのライターとリーダーの両方は、バイトのストリームがファイル、メモリの一部、さらには紙テープリーダーに入れられても、順序が変更されず、バイトが処理されていない限り気にしません。追加または紛失。
実際には、それらをファイルに書き込むことができると思われるときはいつでも、その後ファイル名を他の人に渡す場合は、ストリームを使用することもできます。あなた、またはファイルへの書き込みを指示したオブジェクトが、ストリームの宛先 (メモリ / 紙テープ / ファイル) を指定してストリームを作成します。ストリームは、ストリームを読み取ることができる他のユーザーに渡されます。
例: MySpecialObject には MySpecialData というデータがあります。この特別なデータをシリアライズおよびデシリアライズするクラスがあります。これらのクラスは、データが物理的にシリアライズされる場所には関心がありません:patertape? ディスケット?メモリー。バイト ストリームを読み書きすることでシリアル化 (逆) できることだけを知っていればよいのです。その場合、System.IO.Stream のインスタンスを使用します。
(クラスを見つけやすくするために、名前空間を記述します)
class MySerializer
{
private System.IO.Stream myStream = null;
public MySerializer(system.IO.Stream stream)
{
this.myStream = stream;
}
public void Serialize(object data)
{
System.Xml.Serialization.XmlSerializer serializer =
new System.Xml.SerializationXmlSerializer(data.GetType());
System.XML.XmlWriter writer = System.XML XmlWriter.Create(this.MyStream);
serializer.Serialize(writer, data);
}
}
よく見ると、ファイルを使用する場合との唯一の違いは XMLWriter.Create() のパラメーターであることがわかります。
これを mySpecialObject で使用すると、次のようになります。
public void SerializeMySpecialData()
{
System.IO.Stream myStream = new System.IO.MemoryStream();
// in this case: read and write using only memory.
// if you want to write to something else, for instance a file,
// create a file stream.
// or any other subclass from Sytem.IO.Stream. The serializer won't notice
// where it is actually stored.
MySerializer mySerializer = new MySerializer(myStream);
mySerializer.Serialize(mySpecialData);
myStream.Flush();
myStream.Close();
myStream.Dispose(); // this function will probably also flush and close
}
ストリームからの XML の読み取りは、ファイルからの XML の読み取りに似ています。
public object Deserialize(System.Type expectedDataType)
{
object data = null;
System.Xml.Serialization.XmlSerializer deserializer =
new System.Xml.SerializationXmlSerializer(expectedDataType);
System.XML.XmlReader reader = System.XML XmlReader.Create(this.MyStream);
deserializer.Deserialize(reader, data);
return data;
}
繰り返しますが、利点は、呼び出し元がデータを実際に保存する場所を決定できることです。データが異なるタイプのメディアに保存されている場合、シリアル化クラスは違いを認識しないため、変更する必要はありません。
データが保存されているシリアル化クラスのユーザーに対して非表示にすることもできます。その場合、シリアル化クラスのコンストラクターがストリームを作成します。このアプローチは、すべてのデータをすべて同じメディアでシリアル化する場合に役立ちます。