C# deserialize()创建新对象,而不是读取我希望它读取的对象

C# deserialize()创建新对象,而不是读取我希望它读取的对象,c#,wcf,wcf-rest,C#,Wcf,Wcf Rest,因此,当我尝试使用: WebRequest request = WebRequest.Create("http://localhost:9998/API/GetGameById/" + ID.ToString()); WebResponse ws = request.GetResponse(); StreamReader responseStream = new StreamReader(ws.GetResponseStream());

因此,当我尝试使用:

        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;
get返回的“游戏”与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>

1.
1.
0
0
0
但是在回程标记处的比赛是这样锁定的

 <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>

0
0
0
0
游戏类,如果有任何帮助:

[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();
    }
}
[DataContract(Namespace=”“)]
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
公开课游戏
{
[数据成员]
int-Id;
[数据成员]
国际[]玩家;
[数据成员]
int[]游戏板;
[数据成员]
林希泽;
[数据成员]
int-vsize;
[数据成员]
int=0;
公共游戏()
{ }
公共游戏(int newgameID)
{
Id=++newgameID;
}
公共int GetSetId
{
获取{return Id;}
设置{Id=value;}
}
public int[]GetSetGameboard
{
获取{return Gameboard;}
设置{Gameboard=value;}
}
公共整数GetSetwinner
{
获取{return winner;}
设置{winner=value;}
}
public int[]GetPlayerList
{
获取{返回玩家;}
}
public void AddPlayer()
{
int新玩家;
if(Players==null)
玩家=新整数[0];
List temp=Players.ToList();
如果(临时计数==0)
NewPlayer=1;
其他的
{
NewPlayer=temp.Last();
NewPlayer++;
}
临时添加(新玩家);
玩家=临时托雷();
}
}
对不起,如果我给了你太多/太少,但这是我的第3或第4篇文章,所以我仍在学习,问问你是否遗漏了什么

非常感谢你抽出时间来帮助我


祝你今天愉快

您可能希望使用
DataContractSerializer
而不是XmlSerializer。

您可能希望使用
DataContractSerializer
而不是XmlSerializer。

我尝试了此扩展方法,但效果良好。问题可能是因为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);
    }
}
public static T反序列化WithDataContractSerializer(此字符串为xml)
{
var dataContractSerializer=新的dataContractSerializer(typeof(T));
使用(var reader=newXMLTextReader(newStringReader(xml)))
{
return(T)dataContractSerializer.ReadObject(reader);
}
}
[测试]
公开测试()
{
字符串xml=
@" 
1.
1.
0
0
0
";
var game=xml.DeserializeWithDataContractSerializer();
aresequal(1,game.GetSetId);
}

我尝试了这个扩展方法,但效果很好。问题可能是因为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);
    }
}
public static T反序列化WithDataContractSerializer(此字符串为xml)
{
var dataContractSerializer=新的dataContractSerializer(typeof(T));
使用(var reader=newXMLTextReader(newStringReader(xml)))
{
return(T)dataContractSerializer.ReadObject(reader);
}
}
[测试]
公开测试()
{
字符串xml=
@" 
1.
1.
0
0
0
";
var game=xml.DeserializeWithDataContractSerializer();
aresequal(1,game.GetSetId);
}

我忘了提到我在服务器和客户端都有游戏类,但这已经解决了问题。谢谢大家。我忘了提到我在服务器和客户端都有游戏类,但这已经解决了问题。谢谢大家