大量のデータをストリーミングするための WCF サービスを開発しているため、 protobuf-netシリアル化と組み合わせたWCF ストリーミング機能を使用することにしました。
環境:
一般的には、サービス内のオブジェクトをシリアル化し、それらをストリームに書き込んで送信するというアイデアがあります。一方、呼び出し元は 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<BusinessResponse>(methodResult.ResultBody);
return result;
したがって、serializer.Deserialize()
が呼び出されると、 stream から読み取りますmethodResult.ResultBody
。同時に、サービス側で WCF は、 から返された MemoryStream を読み取りTestMethod
ます。
問題:
MemoryStream
私たちが達成したいことは、サービス側でオブジェクト全体の最初のシリアル化を一度に取り除くことです。ストリーミングを使用しているため、送信前にシリアル化されたオブジェクトをメモリに保持することは避けたいと考えています。
考え:
TestMethod()
完全な解決策は、シリアル化されるオブジェクト (私の例では 'BusinessResponse' オブジェクト) への参照を使用して、空のカスタムメイドの Stream オブジェクト (から) を返すことです。したがって、WCF がRead()
ストリームのメソッドを呼び出すときは、protobuf-net を使用してオブジェクトの一部を内部でシリアル化し、メモリに保存せずに呼び出し元に返します。
ここで問題が発生します。実際に必要なのは、ストリームが読み取られる瞬間にオブジェクトを 1 つずつシリアル化する可能性があるためです。これはシリアライゼーションのまったく異なる方法であることを理解しています。オブジェクトをシリアライザーにプッシュする代わりに、シリアライズされたコンテンツを少しずつ要求したいと思います。
そのようなシリアル化は、protobuf-net を使用して何とか可能ですか?