我目前正在研究套接字服务器,我很想知道 为什么像
这样的序列化器所有都需要Stream而不是字节数组?
答案 0 :(得分:52)
这意味着您可以流式传输到任意目的地,而不是只到内存。
如果你想在文件中写一些东西,你为什么要先在内存中创建一个完整的副本?在某些情况下,可能会导致您使用额外内存的批次,可能导致失败。
如果要创建字节数组,只需使用MemoryStream
:
var memoryStream = new MemoryStream();
serializer.Write(foo, memoryStream); // Or whatever you're using
var bytes = memoryStream.ToArray();
因此,使用"的抽象,您使用流"你可以很容易地使用内存 - 但如果抽象是"你使用字节数组"即使你不想,也强迫使用记忆。
答案 1 :(得分:10)
您可以轻松地在字节数组上创建一个流...但是字节数组本身具有大小限制,其中流是开放式的...根据需要大。一些序列化可能非常庞大。
编辑:另外,如果我需要实现某种序列化,我想做最基本的抽象,并避免在多个抽象中进行。流是我的选择,因为有很多东西的流实现:内存,磁盘,网络等等。作为一个实施者,我得到的是" free"。
答案 2 :(得分:5)
如果你使用byte array/ buffer
,你暂时在记忆中工作,而且你的身材有限
虽然流可以让您将内容存储在磁盘上,但是可以发送到其他计算机,例如互联网,串行端口等。流通常使用缓冲区来优化传输速度。
如果您正在处理大文件
,那么流式传输将非常有用答案 3 :(得分:1)
@ JonSkeet的回答是正确的,但作为附录,如果您制作临时流的问题是"我不喜欢它,因为它&# 39;努力"然后考虑编写扩展方法:
namespace Project.Extensions
{
public static class XmlSerialiserExtensions
{
public static void Serialise(this XmlSerializer serialiser, byte[] bytes, object obj)
{
using(var temp = new MemoryStream(bytes))
serialiser.Serialize(temp, obj);
}
public static object Deserialise(this XmlSerializer serialiser, byte[] bytes)
{
using(var temp = new MemoryStream(bytes))
return serialiser.Deserialize(temp);
}
}
}
所以你可以继续做
serialiser.Serialise(buffer, obj);
socket.Write(buffer);
或者
socket.Read(buffer);
var obj = serialiser.Deserialise(buffer);
答案 4 :(得分:-3)
当在机器相关的应用程序(例如缓冲区)中操作ASCII(即1字节)字符串时,更频繁地使用字节数组。它们更适合低级应用程序,而“流”是处理数据的更通用方式,可以实现更广泛的应用程序。此外,流是一种更抽象的数据查看方式,它允许诸如字符类型(UTF-8,UTF-16,ASCII等)之类的考虑因素由数据流用户不可见的代码处理。