Ленивая, управляемая потоком сериализация объекта с protobuf-net

Мы разрабатываем сервис WCF для потоковой передачи большого объема данных, поэтому мы решили использоватьWCF Streaming функциональность в сочетании сProtobuf-сеть сериализации.

Контекст:

Обычно идея состоит в том, чтобы сериализовать объекты в сервисе, записать их в поток и отправить. На другом конце вызывающая сторона получит объект Stream и сможет прочитать все данные.

Поэтому в настоящее время код метода службы выглядит примерно так:

public Result TestMethod(Parameter parameter)
{
    // Create response
    var responseObject = new BusinessResponse { Value = "some very large data"};

    // The resposne have to be serialized in advance to intermediate MemoryStream
    var stream = new MemoryStream();
    serializer.Serialize(stream, responseObject);
    stream.Position = 0;

    // ResultBody is a stream, Result is a MessageContract
    return new Result {ResultBody = stream};
}

Объект BusinessResponse сериализуется в MemoryStream и возвращается из метода. На стороне клиента код вызова выглядит так:

var parameter = new Parameter();

// Call the service method
var methodResult = channel.TestMethod(parameter);

// protobuf-net deserializer reads from a stream received from a service.
// while reading is performed by protobuf-net, 
// on the service side WCF is actually reading from a 
// memory stream where serialized message is stored
var result = serializer.Deserialize(methodResult.ResultBody);
return result;

Так когдаserializer.Deserialize() называется это читает из потокаmethodResult.ResultBodyВ то же время на стороне службы WCF читает MemoryStream, который был возвращен из.TestMethod

Проблема:

То, что мы хотели бы достичь, это избавиться отMemoryStream и начальная сериализация всего объекта сразу на стороне сервиса. Поскольку мы используем потоковую передачу, мы хотели бы избежать сохранения сериализованного объекта в памяти перед отправкой.

Идея:

Идеальным решением было бы вернуть пустой, сделанный на заказ объект Stream (изTestMethod()) со ссылкой на объект, который должен быть сериализован ('BusinessResponse» объект в моем примере). Поэтому, когда WCF вызываетRead() метод моего потока, я внутренне сериализирую часть объекта, используя protobuf-net, и возвращаю его вызывающей стороне, не сохраняя его в памяти.

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

Разве возможна такая сериализация с использованием protobuf-net?

Ответы на вопрос(1)

Ваш ответ на вопрос