1

我有序列化List<Server> servers

服务器类具有以下变量:

public class Server
{
    string serverName { get; set; }
    string dnsIP { get; set; }
    Game game { get; set; }

和游戏类:

public class Game
{
    public enum Genre { FPS, RTS, RPG, MMO, MOBA, TPS, Sandbox, Other };
    private string gameName { get; set; }
    private Genre genre { get; set; }

当我尝试像这样序列化时:

 private void saveServersToolStripMenuItem_Click(object sender, EventArgs e)
        {

            SaveFileDialog saveFileDialog = new SaveFileDialog();
            saveFileDialog.Filter = "XML files (*.xml)|*.xml";
            saveFileDialog.InitialDirectory = ".";

            if (saveFileDialog.ShowDialog() == DialogResult.OK)
            {
                Stream myStream = null;
                if ((myStream = saveFileDialog.OpenFile()) != null)
                {
                    var serializer = new XmlSerializer(typeof(List<Server>));
                    serializer.Serialize(myStream, Arrays.servers);
                    myStream.Close();
                }
                saveFileDialog.Dispose();
            }

        }

我得到了这样的 XML 文件:

<?xml version="1.0"?>
<ArrayOfServer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Server />
  <Server />
</ArrayOfServer>

我如何获取 serverName 、 dnsIP 、 gameName 、流派等所有信息。

4

2 回答 2

2

公开您的财产。序列化器需要能够读取您的属性,否则它不知道如何序列化对象。

public class Server
{
    public string serverName { get; set; }
    public string dnsIP { get; set; }
    public Game game { get; set; }
}

public class Game
{
    public enum Genre { FPS, RTS, RPG, MMO, MOBA, TPS, Sandbox, Other };

    public string gameName { get; set; }        
    public Genre genre { get; set; }
}

如果您出于某些原因将这些属性设为私有,您还可以使用IXmlSerializable接口并覆盖 GetSchema、ReadXml 和 WriteXml 方法来访问您的私有属性。但是,如果您这样做,您将失去 xml 序列化程序的所有易用性。

您可以在 MSDN http://msdn.microsoft.com/en-us/library/system.xml.serialization.ixmlserializable.aspx上阅读有关 IXmlSerializable 接口的更多信息

于 2013-06-30T11:46:42.843 回答
1

您的Server类没有公共属性,它只有内部属性 - XmlSerializer仅适用于公共属性/字段。

XML 序列化是将对象的公共属性和字段转换为序列格式(在本例中为 XML)以进行存储或传输的过程。

如果您需要使用字段,我建议您改用DataContractSerializer,它在这方面更加灵活。

但是,如果不是这种情况,您只需要更新字段以具有public访问修饰符,即

public class Server
{
    public string serverName { get; set; }
    ...
}
于 2013-06-30T11:50:26.877 回答