【发布时间】: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<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?).
*已解决:答案贴在下面。
【问题讨论】:
-
@jstreet 我试过了,但它不起作用,客户端不知道 StageContract 类型,而是它似乎接收到 Object 类型的对象。它一直说这是反序列化格式化程序的问题,并建议我使用 XmlNode[]。
-
@jstreet 我做了,但它使它无法使用。我重新配置了服务引用以返回 System.Collections.Generic.List。试了投,还是不行。
-
@jstreet 我发布了服务的 MCVE。
-
@jstreet 也许 ServiceKnownType 没有正确传输到客户端?或者我还没有正确配置客户端来查看它?
-
@jstreet 这是一个用 WPF 制作的客户端。对不起,我忘了提。我有一些要填充的 XAML 控件。
标签: c# wpf wcf deserialization datacontract