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

时间:2017-03-24 13:24:20

标签: c# serialization stream

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

这样的序列化器

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

5 个答案:

答案 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等)之类的考虑因素由数据流用户不可见的代码处理。