0

だから私が使おうとすると:

        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「response」のゲームと同じプロパティを持たず、次のようになります。

    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番目の投稿なので、私はまだあなたの不足しているものがあるかどうか尋ねるだけで学んでいます

時間を割いて私を助けてくれてありがとう!

すてきな一日を!!

4

2 に答える 2

2

XmlSerializer の代わりに、ここに示すDataContractSerializerように を使用することもできます。

于 2012-11-24T00:57:45.887 に答える
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);
}
于 2012-11-24T01:06:57.430 に答える