. net框架中充满了这样的例子:一个方法调用将返回一个流,然后你可以根据需要读取和实现这个流。但在被窝里是怎么工作的呢?是什么在阻挡潮流?
假设我正在编写一个解析器,它接受一些输入并将一些数据解析为预定义的格式。例如,如果我创建了一个MemoryStream,然后使用StreamWriter将我的内容写入其中,然后使用该方法返回该流,我将遇到问题,因为写入器将在完成时关闭底层流,调用者将无法按预期读取它。
这通常是如何管理的?流的内容是否存储在对象中,直到需要(如byte[]
),然后当请求流的方法被调用时,它在那个时候创建它还是什么?
流是字节序列的抽象,例如文件、输入/输出设备、进程间通信管道或TCP/IP套接字。Stream类及其派生类提供了这些不同类型输入和输出的通用视图,将程序员与操作系统和底层设备的具体细节隔离开来。(MSDN说)
所以我想你使用序列化,序列化使用不同的格式在。net中使用流需要定义你的需求
序列化是将对象转换为持久存储的字节的过程。反序列化过程将字节转换为对象,而不会丢失任何数据。序列化用于在文件或数据库中存储值,通过网络发送对象以及转换回原始对象格式。. net框架提供了一组框架类库(FCL)来简化序列化过程。它对于在两个不同的应用程序之间发送数据非常有用。
. net框架支持二进制序列化和XML序列化格式。XML序列化只序列化公共字段。但是,二进制序列化将序列化所有私有和公共字段。序列化可以作为基本的或自定义的方式执行。当一个类应用了SerializableAttribute属性时,就会发生基本序列化。基本序列化不支持版本控制。自定义序列化类必须标记为SerializableAttribute并实现isserializable接口。用户可以为二进制和XML序列化格式实现自定义序列化。GetObjectData需要被自定义应用程序覆盖。示例应用程序对二进制和XML序列化都使用自定义序列化。. net框架支持与开发工具相关的设计器序列化。自定义序列化自定义序列化是控制序列化和反序列化过程的过程。自定义序列化可以通过在序列化期间和之后运行自定义方法来实现,也可以通过实现isserializable接口来实现。自定义序列化用于序列化对象的版本控制。如果序列化的对象改变了对象状态(在以后的版本中添加了一个新文件),则使用自定义序列化来获取值而不丢失数据。由于缺少属性,序列化对象的版本控制可能会失败。
如果用户希望在序列化期间和之后使用自定义方法,用户应该使用OnDeserializedAttribute, OnDeserializingAttribute, OnSerializedAttribute和OnSerializingAttribute属性来应用自定义序列化支持,以便在序列化和反序列化期间自定义数据。OptionalFieldAttribute属性用于忽略反序列化的旧版本数据。格式化程序在反序列化期间不会给出任何错误。它允许在序列化/反序列化之前和之后更新对象。
我想下面的链接对你有帮助
http://www.codeproject.com/Articles/422474/Serialization-using-different-formats-in-NET
流可以由许多不同的东西支持。这就是从Stream抽象基类派生的流的整个思想。
流可以由操作系统级别的文件流、内存、HTTP连接或其他任何可以完成Stream
合约的东西来支持。
在MemoryStream
的情况下,后备存储只是一个内存块。
在StreamWriter
的情况下,调用Dispose()将关闭底层流。确保只要您还想使用流,就不要丢弃写入器。另外,如果你想在写入MemoryStream
后重新访问它,请确保将位置设置在开头,例如:
memStream.Seek(0, SeekOrigin.Begin);
StreamWriter有一个重载的构造函数,你可以用它来指示写操作不关闭流。
同时,Stream应该有一个. writebytes方法,允许你完全避免使用StreamWriter。