2013-03-07 57 views
2

.NET框架中充满了方法调用将返回一个Stream的示例,您可以根据需要随时阅读和实现该Stream。但是这是如何在封面下工作的?什么支持流?如何实现返回Stream的方法?

假设我正在编写一个解析器,它需要一些输入并将一些数据解析为预定义的格式。例如,如果我创建了一个MemoryStream,然后使用StreamWriter将我的内容写入它,然后使该方法返回该流,则会遇到问题,因为编写器将在完成时关闭底层流,并且调用方将无法按预期阅读。

这是如何管理的?是否存储在对象中的流的内容直到需要(例如byte[]),然后当请求流的方法被调用时,它会在当时创建它,或者什么?

+2

你指的是什么魔法链接帮助? 'Stream GetAStream(){return new MemoryStream();}'工作。 – 2013-03-07 19:17:09

回答

5

流是字节序列的抽象,如文件,输入/输出设备,进程间通信管道或TCP/IP套接字。 Stream类及其派生类提供了这些不同类型的输入和输出的通用视图,将程序员与操作系统和底层设备的特定细节隔离开来。 [MSDN所述]

,所以我想你使用.NET不同的格式,通过使用流使用序列,进行序列化需要定义需求

序列化是在转换一个目的是字节的持久性存储装置的过程。反序列化过程将字节转换为对象,而不会丢失任何数据。序列化用于将值存储在文件或数据库中,通过网络发送对象并将其转换回原始对象格式。 .NET框架提供了一组用于简化序列化过程的框架类库(FCL)。在两个不同应用程序之间发送数据非常有用。

.NET Framework支持二进制序列化和XML序列化格式。 XML序列化仅序列化公共字段。但是,二进制序列化将序列化所有私人和公共领域。序列化可以按照基本或自定义进行。基本序列化发生在一个类应用了SerializableAttribute属性的时候。基本序列化不支持版本控制。自定义序列化类必须标记为SerializableAttribute并实现ISerializable接口。用户可以实现Binary和XML序列化格式的自定义序列化。 GetObjectData需要被自定义应用程序覆盖。示例应用程序针对二进制和XML序列化使用自定义序列化。 .NET Framework支持与开发工具关联的设计器序列化。 定制序列化

定制序列化是控制序列化和反序列化过程的过程。自定义序列化可以通过在序列化期间和之后运行自定义方法或通过实现ISerializable接口来实现。自定义序列化用于对序列化对象进行版本控制。如果序列化对象已更改对象状态(在更高版本中添加了新文件),则使用自定义序列化获取值而不丢失数据。由于缺少属性,序列化对象的版本可能会失败。

如果用户想要在序列化期间和之后使用自定义方法,用户应该使用OnDeserializedAttribute,OnDeserializingAttribute,OnSerializedAttribute和OnSerializingAttribute属性应用自定义序列化支持,以便在序列化和反序列化期间自定义数据。 OptionalFieldAttribute属性用于忽略用于反序列化的旧版本数据。格式化程序在反序列化过程中不会给出任何错误。它允许在序列化/反序列化之前和之后更新对象。

我想下面你
http://www.codeproject.com/Articles/422474/Serialization-using-different-formats-in-NET

2

该流可以由许多不同的东西支持。这就是来自Stream抽象基类的流的全部概念。

该流可以通过操作系统级文件流,内存,HTTP连接或其他任何可以满足Stream合同的支持。

MemoryStream的情况下,后备存储只是一块内存。

StreamWriter的情况下,调用Dispose()将关闭基础流。只要您仍想使用流,请确保您不要处置作者。另外,如果你想要写之后重新访问MemoryStream,确保并设置位置开始,如:

memStream.Seek(0, SeekOrigin.Begin); 
+0

IStream是一个COM接口类型。你不能分配一个MemoryStream给它......或者一个FileStream。 – 2013-03-07 19:28:40

+0

@MthetheWWatson:Do'h。更新了我的答案。 – 2013-03-07 22:27:37

1

的StreamWriter有一个重载的构造函数,你可以用它来指示写不关闭流。

另外,Stream应该有一个.WriteBytes方法,它可以让你完全避免一个StreamWriter。

相关问题