首页 文章

WCF测试客户端如何反序列化数据 Contract ?如何反序列化DataContract对象的List

提问于
浏览
-1

我已经实现了一个由WCF测试客户端成功反序列化的数据协定 . 现在,我如何在我制作的自定义客户端中执行此操作?

我的 Contract 是这样的:

[ServiceContract]
[ServiceKnownType(typeof(List<StageContract>))]
public interface IUserService
{
    [OperationContract]
    void CreateUser(string name, string pwd, bool admin);

    [OperationContract]
    bool LogInUser(string name, string pwd);

    [OperationContract]
    List<StageContract> getAllStages();


[DataContract]
public class StageContract
{
    private int _stageID;
    private int _projectID;
    private int _wip;
    private string _name;
    private int _position;

    public StageContract(Stage s)
    {
        StageID = s.ID;
        ProjectID = s.ProjectID;
        WIP = s.WIP;
        Name = s.Name;
        Position = s.Position;
    }

    [DataMember]
    int StageID
    {
        get { return _stageID; }
        set { _stageID = value; }
    }

    [DataMember]
    int ProjectID
    {
        get { return _projectID; }
        set { _projectID = value; }
    }

    [DataMember]
    int WIP
    {
        get { return _wip; }
        set { _wip = value; }
    }

    [DataMember]
    string Name
    {
        get { return _name; }
        set { _name = value; }
    }

    [DataMember]
    int Position
    {
        get { return _position; }
        set { _position = value; }
    }
}
}

服务类具有以下内容:

public List<StageContract> getAllStages() 
    {
            return (new StageController())
           .getAllStages()
           .Values
           .Select(s => new StageContract(s))
           .ToList();
    }

在客户端:

using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using KanbanProject.ServiceReference1;

public partial class MainWindow : Window
{
    public MainWindow()
    {

        InitializeComponent();
        this.Loaded += new RoutedEventHandler(MainWindow_Loaded);

    }

    void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        var client = new UserServiceClient();
        List<StageContract> myList = client.getAllStages();
    }

在执行时我遇到以下错误:

An unhandled exception of type 'System.ServiceModel.Dispatcher.NetDispatcherFaultException' 
occurred in mscorlib.dll

Additional information: The formatter 
threw an exception while trying to deserialize 
the message: There was an error while trying to 
deserialize parameter http://tempuri.org/:getAllStagesResult. 
The InnerException message was 'Element getAllStagesResult from 
namespace http://tempuri.org/ cannot have child contents to be 
deserialized as an object. Please use XmlNode[] to deserialize 
this pattern of XML.'.  Please see InnerException for more details.

我试过调查XmlNode []用法:http://geekswithblogs.net/TimH/archive/2006/02/09/68857.aspx

这也是:WCF: Serializing and Deserializing generic collections

这:WCF. IList is deserialized as array. How to make it be any writable list (ArrayList)?

这个:WCF/RESTful DataContract deserialization issue

先感谢您!

*更新:在客户端最终反序列化后,我遇到以下情况:

For List<StageContract> myList = client.getAllStages(); I have Cannot implicitly convert type "object" to "System.Colections.Generic.List<StageContract>" An explicit conversion exists(are you missing a cast?).

*已解决:答案发布在下面 .

2 回答

  • 1

    [ServiceKnownType(typeof(List<StageContract>))] 更改为 [ServiceKnownType(typeof(StageContract))] . 您永远不必识别 List<T> ...仅 T . 在您的情况下, T 仍然不在KnownTypes中 .

  • 0

    解决了它:问题是ServiceReference配置集合类型 . 即使我之前更改了它 System.Collections.Generic.List ,我还是留下了 Always generate message contracts ,这反过来因为某种原因没有让 StageContract 类型得到识别 .

    谢谢@jstreet和@Clay!

相关问题