为什么大多数序列化程序使用流而不是字节数组?

Jan*_*kke 29 c# serialization stream

我目前正在研究套接字服务器,我想知道为什么序列化器会像

所有都需要Stream而不是字节数组?

Jon*_*eet 51

这意味着您可以流式传输到任意目的地而不仅仅是内存.

如果要将某些内容写入文件,为什么要先在内存中创建完整的副本?在某些情况下,可能会导致您使用大量额外内存,可能导致失败.

如果要创建字节数组,只需使用MemoryStream:

var memoryStream = new MemoryStream();
serializer.Write(foo, memoryStream); // Or whatever you're using
var bytes = memoryStream.ToArray();
Run Code Online (Sandbox Code Playgroud)

因此,通过"使用流"的抽象,您可以轻松地使用内存 - 但如果抽象是"您使用字节数组" ,即使您不想这样做,您也不得不使用内存.

  • @CodeJoy:流是否暴露了套接字?通常情况就是如此.是否真的很难编写`SomeMethod(new MemoryStream(bytes))`而不是`SomeMethod(bytes)`?对我来说似乎不是很困难. (8认同)
  • @Pharap:嗯,这是它的一部分 - 另一部分是,即使它只占用原始图形的内存,它仍然是对象图形的全部额外副本...... (2认同)

Cla*_*lay 11

您可以轻松地在字节数组上创建流...但是字节数组本身就是大小限制的,其中流是开放式的...根据需要大.一些序列化可能非常巨大.

编辑:另外,如果我需要实现某种序列化,我想做最基本的抽象,并避免必须通过多个抽象.流是我的选择,因为有很多东西的流实现:内存,磁盘,网络等等.作为一个实施者,我得到了"免费"的.


BRA*_*mel 5

如果你使用的是byte array/ buffer你暂时在记忆中工作而且你的身材有限

虽然流是允许您将内容存储在磁盘上的东西,但是可以发送到其他计算机,例如互联网,串行端口等.流通常使用缓冲区来优化传输速度.

因此,如果您正在处理大型文件,则流式传输将非常有用