【发布时间】:2017-03-07 21:08:17
【问题描述】:
我目前正在处理我的最终项目,其中包含 WCF、WPF 和 C# 的使用,我很难通过 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));
}
经过一段时间的调试,我发现问题出在 list 变量中,我尝试将其仅更改为 Player 变量 ->同样的错误。使我的缓冲区和消息大小更大也是如此。 代码不会崩溃并发送我的 Run 对象的唯一方法是当 List 不是数据成员时..
//[DataMember]
public List<Player> Players { get; set; }
如果我执行上述操作,代码可以完美运行,但我迫切需要将 List 传递给客户端。 对不起,很长的帖子,但我没有很长的时间,我需要完成它,任何帮助将不胜感激。 (另外,很抱歉格式不好,我已经尽力了)
【问题讨论】:
-
你能生成一个返回你需要的List的方法吗?
-
@jmag 我想我可以生成一个,但我可以看到随之而来的问题。我更喜欢上面的用法。明天我会尝试用一种方法来做(这里是 00:00),我会在这里更新。谢谢!
-
我想知道 List
是否被认为是 Data Contract Serializer 支持的类型之一。 msdn.microsoft.com/en-us/library/ms731923(v=vs.110).aspx会不会是这个错误? -
@jmag -
List<T>受数据合约支持 - 我一直在使用它们。 -
如果你感兴趣,我在下面找到了解决方案。也谢谢你们。