如何将List <customclass>序列化为XML </customclass>

时间:2013-06-30 11:39:36

标签: c# xml xml-serialization

我已序列化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,genre等所有信息。

2 个答案:

答案 0 :(得分:2)

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

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界面的更多信息

答案 1 :(得分:1)

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

  

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

如果您需要使用字段,我建议您切换到DataContractSerializer,在这方面它会更灵活。

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

public class Server
{
    public string serverName { get; set; }
    ...
}