Потоковая, настраиваемая сериализация огромных объектов в .NET - PullRequest
2 голосов
/ 22 августа 2010

В .NET я хотел бы вызвать веб-сервис в стиле REST, который ожидает тело POST, представляющее собой двоичную сериализацию класса, в следующей форме:

public class Test
{
    public string Name;
    public byte[] Data;
}

Поток битов должен быть точнотак же, как при использовании BinaryFormatter.Serialize ().Проблема в том, что член Data может быть очень большим, и я (как вызывающая сторона), в свою очередь, получаю его из файлового потока.Я не хочу сначала создавать экземпляр класса в памяти, читая все данные из файла, а затем сериализовать его снова, чтобы вызвать веб-сервис.Вместо этого я предполагаю использовать что-то похожее на BinaryWriter, но поддерживающее что-то вроде этого псевдокода:

var w = new MagicBinaryWriter(myOutputStreamToPost);
w.BeginObject(typeof(Test));
w.WriteString("some string");
w.WriteByteArray(myFileStream);
w.EndObject();

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

Я искал, так сказать, низкоуровневые интерфейсы «строительных блоков», предпочтительно те, которые использует сам BinaryFormatter.Serialize (),но без удачи.Они существуют?Или, по крайней мере, очень точные спецификации о том, как выглядит формат сериализации .NET, чтобы я мог свернуть свой собственный?

Ответы [ 2 ]

1 голос
/ 22 августа 2010

Вы не можете реально реализовать замену BinaryFormatter.Точный формат генерируемых двоичных данных не задокументирован.А структура сложная, она добавляет метаданные к фактическим данным объекта, что позволяет читателю воссоздать тип объекта.Он также не является точным совпадением с макетом коллекции, он до некоторой степени выравнивает граф объекта, чтобы избежать создания слишком большого количества метаданных.Объем кода в BinaryFormatter довольно велик.

Решите это в источнике и подумайте о другом представлении данных, которое не занимает так много памяти.

1 голос
/ 22 августа 2010

Почему бы вам не декомпилировать сборки .net и не посмотреть, как работает BinaryFormatter.Serialize ()?Вы можете использовать Redgate или другой декомпилятор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...