2017-03-07 91 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