使用protobuf-net传递IList <t>与IEnumerable <t> </t> </t>

时间:2009-08-06 21:17:14

标签: wcf protobuf-net

我在protobuf-net changelog中注意到IList&lt;&gt;得到了支持,但我得到了“无法创建接口实例”的例外情况。如果我改为IEnumerable&lt;&gt;那么生活是美好的。这听起来不错吗?

    // Client call
    public override IList<IApplicationWorkflow> Execute(IRoleManagement service)
    {
        IList<ApplicationWorkflowMessagePart> list = service.RetrieveWorkflows(roleNames);

        IList<IApplicationWorkflow> workflows = new List<IApplicationWorkflow>(list.Count);

        foreach (ApplicationWorkflowMessagePart a in list)
        {
            workflows.Add(new ApplicationWorkflowImpl(a));
        }

        return workflows;
    }


    // Service contract
    [OperationContract, ProtoBehavior]
    [ServiceKnownType(typeof (ServiceFault))]
    [FaultContract(typeof (ServiceFault))]
    IList<ApplicationWorkflowMessagePart> RetrieveWorkflows(string[] roleNames);


    // Service implementation
    public IList<ApplicationWorkflowMessagePart> RetrieveWorkflows(string[] roleNames)
    {
        IList<IApplicationWorkflow> workflows = manager.RetrieveApplicationWorkflows(roleNames);
        IList<ApplicationWorkflowMessagePart> workflowParts = new List<ApplicationWorkflowMessagePart>();
        if (workflows != null)
        {
            foreach (IApplicationWorkflow workflow in workflows)
            {
                workflowParts.Add(
                    ModelMediator.GetMessagePart<ApplicationWorkflowMessagePart, IApplicationWorkflow>(workflow));
            }
        }
        return workflowParts;
    }

谢谢, 麦克

此外,是否有文档网站有这个和其他答案?我不想问新问题。 :)

1 个答案:

答案 0 :(得分:2)

目前它会支持IList<T>作为属性,只要它不必创建它 - 即允许类似(为了简洁而未显示属性):

class Order {
    private IList<OrderLine> lines = new List<OrderLine>();
    public IList<OrderLine> Lines {get {return lines;}}
}

我必须检查,但出于类似的原因,我希望它适用于Merge,但不适用于Deserialize(这是WCF挂钩使用的)。但是,我无法想到它无法默认为List<T>的原因......目前它还没有。

最简单的选择可能是坚持使用List<T> / T[] - 但我可以看一下你是否想要......但我正处于(工作)项目的“紧缩”状态此刻,我今天无法举起发动机罩。


重新“这个和其他答案”......有一个google group,但这不仅仅是protobuf-net(protobuf-net只是许多“协议缓冲”实现中的一个)。

您也可以在project site上自由记录问题。我的意思是整理常见问题解答并将它们添加到网站上的维基 - 但时间并不总是我的朋友......

但是嘿!我在这里......; - p