【问题标题】:How does the WCF test client deserialize data contract? How to deserialize a List of DataContract objectsWCF 测试客户端如何反序列化数据契约?如何反序列化 DataContract 对象列表
【发布时间】:2016-05-02 22:46:45
【问题描述】:

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

我的合同是这样的:

[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&lt;StageContract&gt; myList = client.getAllStages(); I have Cannot implicitly convert type "object" to "System.Colections.Generic.List&lt;StageContract&gt;" An explicit conversion exists(are you missing a cast?).

*已解决:答案贴在下面。

【问题讨论】:

  • @jstreet 我试过了,但它不起作用,客户端不知道 StageContract 类型,而是它似乎接收到 Object 类型的对象。它一直说这是反序列化格式化程序的问题,并建议我使用 XmlNode[]。
  • @jstreet 我做了,但它使它无法使用。我重新配置了服务引用以返回 System.Collections.Generic.List。试了投,还是不行。
  • @jstreet 我发布了服务的 MCVE。
  • @jstreet 也许 ServiceKnownType 没有正确传输到客户端?或者我还没有正确配置客户端来查看它?
  • @jstreet 这是一个用 WPF 制作的客户端。对不起,我忘了提。我有一些要填充的 XAML 控件。

标签: c# wpf wcf deserialization datacontract


【解决方案1】:

[ServiceKnownType(typeof(List&lt;StageContract&gt;))] 更改为[ServiceKnownType(typeof(StageContract))]。你永远不必识别List&lt;T&gt;...只有T。在您的情况下,T 仍然不在 KnownTypes 中。

【讨论】:

  • 感谢您的帮助!我想支持你的回答,但网站说我还没有足够的代表。我想我在您回答之前设法解决了问题;我已在单独的答案中发布了解决方案。
【解决方案2】:

已解决:问题出在 ServiceReference 配置集合类型上。即使我之前将其更改为System.Collections.Generic.List,我也将Always generate message contracts 打勾,这反过来又因为某种原因没有让StageContract 类型被识别。

谢谢@jstreet 和@Clay!

【讨论】:

    猜你喜欢
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    • 2018-08-17
    • 2011-06-28
    • 2011-02-27
    • 2020-02-05
    相关资源
    最近更新 更多