2012-11-24 36 views
0

所以,當我嘗試使用:xmlserializer.deserialize()創建的,而不是讀一個新的對象,我想它來閱讀

 WebRequest request = WebRequest.Create("http://localhost:9998/API/GetGameById/" + ID.ToString()); 
     WebResponse ws = request.GetResponse(); 
     StreamReader responseStream = new StreamReader(ws.GetResponseStream()); 
     string response = responseStream.ReadToEnd(); 

     Game game; 

     using (MemoryStream Stream = new MemoryStream(UTF8Encoding.Default.GetBytes(response))) 
     { 
      XmlSerializer Serializer = new XmlSerializer(typeof(Game)); 
      game = Serializer.Deserialize(Stream) as Game; 
     } 
     responseStream.Close(); 
     return game; 

「遊戲」是得到的返回劑量不具有相同的屬性遊戲中的xmlString「響應」,它像:

game = Serializer.Deserialize(Stream) as Game; 

創建一個遊戲對象的新實例,而不是讓我在指定的ID

「字符串響應」鎖這樣的遊戲:

<Game xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <Gameboard i:nil="true" xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays"/> 
    <Id>1</Id> 
    <Players xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays"> 
     <a:int>1</a:int> 
    </Players> 
    <hsize>0</hsize> 
    <vsize>0</vsize> 
    <winner>0</winner> 
</Game> 

,但在返回標記鎖一樣,如果它的任何幫助,這

<Game xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <Gameboard i:nil="true" xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays"/> 
    <Id>0</Id> 
    <Players i:nil="true" xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays"/> 
    <hsize>0</hsize> 
    <vsize>0</vsize> 
    <winner>0</winner> 
</Game> 

遊戲類遊戲:

[DataContract(Namespace = "")] 
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 
public class Game 
{ 
    [DataMember] 
    int Id; 
    [DataMember] 
    int[] Players; 
    [DataMember] 
    int[] Gameboard; 
    [DataMember] 
    int hsize; 
    [DataMember] 
    int vsize; 
    [DataMember] 
    int winner = 0; 

    public Game() 
    { } 

    public Game(int newgameID) 
    { 
     Id = ++newgameID; 
    } 

    public int GetSetId 
    { 
     get { return Id; } 
     set { Id = value; } 
    } 
    public int[] GetSetGameboard 
    { 
     get { return Gameboard; } 
     set { Gameboard = value; } 
    } 
    public int GetSetwinner 
    { 
     get { return winner; } 
     set { winner = value; } 
    } 
    public int[] GetPlayerList 
    { 
     get { return Players; } 
    } 

    public void AddPlayer() 
    { 
     int NewPlayer; 
     if (Players == null) 
      Players = new int[0]; 
     List<int> temp = Players.ToList(); 
     if (temp.Count == 0) 
      NewPlayer = 1; 
     else 
     { 
      NewPlayer = temp.Last(); 
      NewPlayer++; 
     } 
     temp.Add(NewPlayer); 
     Players = temp.ToArray(); 
    } 
} 

對不起,如果我給你多/少,但這是我的第3或第4篇文章,所以我還在學習只是問你是否缺少東西

非常感謝你花費你的時間並幫助我!

祝您有美好的一天!

回答

1

我試過用這種擴展方法,它的工作原理是預期的。這個問題可能是由於XmlSerializer不能用於私有字段。

public static T DeserializeWithDataContractSerializer<T>(this string xml) 
{ 
    var dataContractSerializer = new DataContractSerializer(typeof(T)); 
    using (var reader = new XmlTextReader(new StringReader(xml))) 
    { 
     return (T)dataContractSerializer.ReadObject(reader); 
    } 
} 
[Test] 
public void GameTest() 
{ 
    string xml = 
     @" <Game xmlns:i=""http://www.w3.org/2001/XMLSchema-instance""> 
       <Gameboard i:nil=""true"" xmlns:a=""http://schemas.microsoft.com/2003/10/Serialization/Arrays""/> 
       <Id>1</Id> 
       <Players xmlns:a=""http://schemas.microsoft.com/2003/10/Serialization/Arrays""> 
        <a:int>1</a:int> 
       </Players> 
       <hsize>0</hsize> 
       <vsize>0</vsize> 
       <winner>0</winner> 
      </Game>"; 
    var game = xml.DeserializeWithDataContractSerializer<Game>(); 
    Assert.AreEqual(1,game.GetSetId); 
} 
+0

我忘了提,我有遊戲類的服務器和客戶端都在,但這個固定反正感謝很多人 – Kladfizk