Подтвердить что ты не робот

Почему большинство сериализаторов используют поток вместо байтового массива?

В настоящее время я работаю на сервере сокетов, и мне было интересно Почему сериализаторы вроде

все требуют Stream вместо байтового массива?

4b9b3361

Ответ 1

Это означает, что вы можете передавать данные в произвольные адресаты, а не только в память.

Если вы хотите что-то записать в файл, зачем вам сначала создавать полную копию в памяти? В некоторых случаях это может привести к тому, что вы будете использовать много дополнительной памяти, что может привести к сбою.

Если вы хотите создать массив байтов, просто используйте MemoryStream:

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

Итак, с абстракцией "вы используете потоки" вы можете легко работать с памятью, но если абстракция "используется байт-массив", вы вынуждены работать с памятью, даже если вы этого не хотите.

Ответ 2

Вы можете легко создать поток по байтовому массиву... но массив байтов по своей сути ограничен по размеру, где поток открыт... большой, как вам нужно. Некоторая сериализация может быть довольно огромной.

Изменить. Кроме того, если мне нужно реализовать некоторую сериализацию, я хочу сделать это для самой базовой абстракции и избежать необходимости делать это по нескольким абстракциям. Поток был бы моим выбором, так как есть потоковые реализации над множеством вещей: память, диск, сеть и т.д. Как разработчик, я получаю их для "свободных".

Ответ 3

если вы используете byte array/ buffer, вы временно работаете в памяти, и вы ограничены по размеру

Хотя поток - это то, что позволяет хранить вещи на диске, отправлять их другим компьютерам, таким как интернет, последовательный порт и т.д. В потоках часто используются буферы для оптимизации скорости передачи.

Таким образом, потоковая передача будет полезна, если вы имеете дело с большим файлом

Ответ 4

@JonSkeet ответ правильный, но в качестве дополнения, если проблема, с которой вы сталкиваетесь при создании временного потока, - "Мне это не нравится, потому что это усилие", тогда подумайте о создании метода расширения:

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);

Ответ 5

Байт-массивы чаще использовались при манипулировании строками символов ASCII (например, 1 байт) часто в машинных зависимых приложениях, таких как буферы. Они придают большую пользу низкоуровневым приложениям, тогда как "потоки" представляют собой более обобщенный способ обработки данных, что позволяет использовать более широкий спектр приложений. Кроме того, потоки представляют собой более абстрактный способ просмотра данных, что позволяет обрабатывать такие вопросы, как тип символа (UTF-8, UTF-16, ASCII и т.д.) Кодом, невидимым для пользователя потока данных.