2017-03-07 93 views
0

我目前正在研究包含使用WCF,WPF和C#的最终项目,并且我很难通过wcf传递一个对象。 经过一段时间后,我收到一条错误消息,说服务器没有提供有意义的响应。 是在方法中使用的类,碰撞是:无法在wcf中传递对象

[DataContract] 
    public class Player 
    { 

     //public static int clientID = 0; 
     [DataMember] 
     public int Wins { get; set; } 
     [DataMember] 
     public int Loses { get; set; } 
     [DataMember] 
     public int realID { get; } 
     [DataMember] 
     public string nickName { get; set; } 


     public Player(int Wins, int Loses, string nickName) 
     { 
      this.Wins = Wins; 
      this.Loses = Loses; 
      this.nickName = nickName; 
      //clientID++; 
      realID = 1; //clientID; 
     } 
    } 
    [DataContract] 
    public class Run 
    { 

     [DataMember] 
     public List<Player> Players { get; set; } 
     [DataMember] 
     public bool isActive { get; set; } 

     public Run() 
     { 
      Players = new List<Player>(); 
     } 

     public void playerJoined(Player player) 
     { 
      Players.Add(player); 
     } 

     public void playerLeft(Player player) 
     { 
      if (Players.Contains(player)) Players.Remove(player); 
     } 

     public void generateRun() 
     { 
      // TODO: get a random map from the DB and pass it to all players 


      return; 
     } 
    } 

和崩溃的代码的方法是:

public Run getRunDetails(int runNumber) 
    { 
     runNumber = runNumber - 1; 
     return Runs[runNumber]; 
    } 

在客户端侧的代码是:

ListBoxItem tempItem = ((ListBoxItem)allRuns.SelectedItem); 
    if(tempItem != null && !tempItem.Content.Equals("There are no runs available, create one now.")) 
    { 
     string numString = ((string)tempItem.Content); 
     numString = numString.Substring(4, numString.Length - 4); 
     run = Service.getRunDetails(int.Parse(numString)); 
    } 

经过一段时间的调试,我发现问题是在列表变量,我试图改变它只有一个玩家变量 - >得到相同的错误。同样可以使我的缓冲区和消息大小更大。 代码不会崩溃,并送我运行对象的唯一方法是当列表不是一个数据成员..

//[DataMember] 
public List<Player> Players { get; set; } 

如果我做了上面的代码工作完美,但我迫切需要的列表传递给客户端。 对不起,但我没有很长时间,我需要它完成,任何帮助将非常感激。 (另外,对不起穷人的格式,我尽力了)

+0

你能生成一个返回你需要的List的方法吗? – jmag

+0

@jmag我想我可以生成一个,但我可以看到随之而来的问题。我更喜欢像上面那样使用。 我会尽量用明天的方法来做到这一点(它的00:00在这里),我会在这里更新。 谢谢! –

+0

我想知道列表是否被认为是Data Contract Serializer支持的类型之一。 https://msdn.microsoft.com/en-us/library/ms731923(v=vs.110).aspx它可能导致错误? – jmag

回答

0

我敢肯定,这里的问题是,你不必在你的播放器参数的构造函数...

尝试添加一个

public Player() {} 

上您的课......

如果不是这样,因为你的“realId” [数据成员]没有二传手,看到正确的序列化只读成员此链接的提示。 WCF: Exposing readonly DataMember properties without set?

此外,如果您已更改通过WCF通道传递的类中的成员,请不要忘记在Visual Studio客户端项目中的WCF服务上更新服务引用。

+0

没有安装人员的房产肯定会造成问题 - 我跑了一段时间,回过头来,花了一些时间找出服务爆炸的原因。 – Tim

+0

添加了空的构造函数也加入了 public Player(int Wins,int Loses,string nickName,int realID) this.Wins = Wins; this.Loses =失去; this.nickName = nickName; this.realID = realID; } 以及public int realID {get;组; } 它正在工作!非常感谢你。 –

+0

这是伟大的尼桑。 WCF /合约序列化与XML序列化不完全相同,但它遵循一些相同的原则。 实际上,你的代码中的一个问题是,你正在序列化实际上是一个业务对象,而实际上你应该只在可能的情况下发送纯数据对象。 而不是参数化的构造函数,应考虑使用构造函数初始化语法。 'var MyObject = New Object(){Prop1 = Value,Prop2 = Value}' 请标记我的回答,如果我有帮助! - 谢谢 – Alan