每当您想将有序数量的字节发送到另一个“thingy”时,它需要以与发送字节相同的顺序来解释字节,使用 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 中使用 this:
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;
}
再一次:优点是调用者决定数据的实际存储位置。如果数据存储在不同类型的媒体上,序列化类将看不到差异,因此不必更改。
您还可以决定对存储数据的序列化类的用户隐藏。在这种情况下,序列化类的构造函数会创建流。如果您希望所有数据都在同一个介质上进行序列化,这种方法会很有用。