我们正在开发用于流式传输大量数据的WCF服务,因此我们选择使用WCF流功能与protobuf-net序列化相结合.
语境:
通常,一个想法是序列化服务中的对象,将它们写入流并发送.另一方面,调用者将接收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};
}
Run Code Online (Sandbox Code Playgroud)
BusinessResponse对象被序列化为MemoryStream,并从方法返回.在客户端,调用代码如下所示:
var parameter = new Parameter();
// Call the service method
var methodResult = …Run Code Online (Sandbox Code Playgroud) 我有一个Linq表达式列表,List<Expression>其中每个表达式类型(表达式将返回的类型)是Item或Item[].
我正在尝试编写一些代码,将提到的集合作为输入参数,并生成一个Linq表达式,它将返回一个列表(或数组)的项目(Item[]).
这是一个抽象的例子:
public static string[] GetStrings()
{
return new[]
{
"first",
"second",
"third"
};
}
public static string GetString()
{
return "single1";
}
private void SOExample()
{
var expressions = new List<Expression>
{
Expression.Call(GetType().GetMethod("GetString")),
Expression.Call(GetType().GetMethod("GetStrings")),
Expression.Call(GetType().GetMethod("GetString")),
Expression.Call(GetType().GetMethod("GetStrings"))
};
// some magic code here
var combined = SomeMagicHere(expressions);
}
private Expression SomeMagicHere(List<Expression> expressions)
{
foreach (var expression in expressions)
{
if (expression.Type.IsArray)
{
// Use array's elements
}
else
{
// Use …Run Code Online (Sandbox Code Playgroud)