XML:写入文件为空



到目前为止,我已经调试了它,列表有值…但是它并没有把它们写到文件中。

我不知道为什么它是空的。

GameObjects类保存所有字段。

GameObjectData仅用于列表。

ChestPlate继承GameObjects。原因是,我正在制作一款游戏,GameObjects中的所有值都与ChestPlate相关。

代码如下:

[Serializable]
public class GameObjects
{
    //Defines name within XML file:
    [XmlElement("Item_ID")]
    public int Item_ID { get; set; }
    [XmlElement("Item_Name")]
    public string Item_Name = "bob";
    [XmlElement("Item_type")]
    public string Item_type = "GameObject";
    [XmlElement("Item_Level")]
    public int Item_Level = 5;
    [XmlElement("Item_description")]
    public string Item_description = "best description evar";
    public GameObjects(int id, string name, string type, int level, string description)
    {
        this.Item_ID = id;
        this.Item_Name = name;
        this.Item_type = type;
        this.Item_Level = level;
        this.Item_description = description;
    }
}

[Serializable]
[XmlInclude(typeof(GameObjects))]
public class GameObjectData
{
    [XmlArrayItem(typeof(GameObjects))]
    public List<GameObjects> GameList { get; set;}
}

public class ChestPlate : GameObjects
{
    [XmlElement("Armour_Rating")]
    int Armour_Rating = 5;
    public ChestPlate(int Armour_id, string Armour_name, string Armour_type, int Armour_level, string Armour_description)
        : base(Armour_id, Armour_name, Armour_type, Armour_level, Armour_description)
    {
        this.Item_ID = Armour_id;
        this.Item_Name = Armour_name;
        this.Item_type = Armour_type;
        this.Item_Level = Armour_level;
        this.Item_description = Armour_description;       
    }
    public  void SerializeToXML(List<GameObjects> responsedata)
    {        
        GameObjectData f = new GameObjectData();
        f.GameList = new List<GameObjects>();
        f.GameList.Add(new GameObjects { Item_ID = 1234, Item_Name = "OMG", Item_type =  "CHESTPLATE", Item_Level = 5, Item_description = "omg" });
        XmlSerializer serializer = new XmlSerializer(typeof(GameObjectData));
        TextWriter textWriter = new StreamWriter(@"C:Test.xml");
        serializer.Serialize(textWriter, f);
        Console.WriteLine(f);           
    }

class Program
{
    static void Main(string[] args)
    {
        GameObjects a = new GameObjects();
        ChestPlate b = new ChestPlate();
        List<GameObjects> d = new List<GameObjects>();
        b.SerializeToXML(d);
        Console.ReadLine();
     }
 }

我已经运行了你的代码,它似乎正确地序列化了你的数据,测试文件是用基类设置的默认参数创建的。

让我有点担心的是实现,我相信你有更多的工作要做,但你需要正确地处理对象,确保继承类的属性和序列化以及它的父类正确完成,否则你将无法正确地反序列化等。我建议你在网上寻找。net中xml序列化的最佳实践,网上有无数的例子,但请参阅下面列出的一些。

    .NET XML序列化复杂类的最佳实践
  • 。. NET XML最佳实践
  • 介绍XML序列化

如果你真的需要使用XML, json是否足够好,甚至二进制序列化,这可能是很好的检查。

在stackoverflow上有几个社区wiki条目,其中包括关于最佳实践的问题,请搜索

请将您输出的代码与下面的完整源代码放在一起。请注意,我更改了保存xml文件的位置为"。test.xml",通常是bin文件夹和调试文件夹,应用程序不会有任何问题,如权限等。

还要注意,在下面的xml中,您已经丢失了序列化了一个ChestPlate对象的事实。

<?xml version="1.0" encoding="utf-8"?>
<GameObjectData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <GameList>
    <GameObjects>
      <Item_Name>OMG</Item_Name>
      <Item_type>CHESTPLATE</Item_type>
      <Item_Level>5</Item_Level>
      <Item_description>omg</Item_description>
      <Item_ID>1234</Item_ID>
    </GameObjects>
  </GameList>
</GameObjectData>

用于生成XML的代码库

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
namespace ConsoleApplication12
{
    class Program
    {
        static void Main(string[] args)
        {
            GameObjects a = new GameObjects();
            ChestPlate b = new ChestPlate();
            List<GameObjects> d = new List<GameObjects>();
            b.SerializeToXML(d);
            Console.ReadLine();
        }
    }
    [Serializable]
    public class GameObjects
    {
        //Defines name within XML file:
        [XmlElement("Item_ID")]
        public int Item_ID { get; set; }
        [XmlElement("Item_Name")]
        public string Item_Name = "bob";
        [XmlElement("Item_type")]
        public string Item_type = "GameObject";
        [XmlElement("Item_Level")]
        public int Item_Level = 5;
        [XmlElement("Item_description")]
        public string Item_description = "best description evar";
        public GameObjects(int id, string name, string type, int level, string description)
        {
            this.Item_ID = id;
            this.Item_Name = name;
            this.Item_type = type;
            this.Item_Level = level;
            this.Item_description = description;
        }
        public GameObjects()
        {
        }
    }
    [Serializable]
    [XmlInclude(typeof(GameObjects))]
    public class GameObjectData
    {
        [XmlArrayItem(typeof(GameObjects))]
        public List<GameObjects> GameList { get; set; }

    }
    public class ChestPlate : GameObjects
    {
        [XmlElement("Armour_Rating")]
        int Armour_Rating = 5;
        public ChestPlate(int Armour_id, string Armour_name, string Armour_type, int Armour_level, string Armour_description)
            : base(Armour_id, Armour_name, Armour_type, Armour_level, Armour_description)
        {
            this.Item_ID = Armour_id;
            this.Item_Name = Armour_name;
            this.Item_type = Armour_type;
            this.Item_Level = Armour_level;
            this.Item_description = Armour_description;
        }
        public ChestPlate()
        {

        }

        public void SerializeToXML(List<GameObjects> responsedata)
        {
            GameObjectData f = new GameObjectData();
            f.GameList = new List<GameObjects>();
            f.GameList.Add(new GameObjects { Item_ID = 1234, Item_Name = "OMG", Item_type = "CHESTPLATE", Item_Level = 5, Item_description = "omg" });

            XmlSerializer serializer = new XmlSerializer(typeof(GameObjectData));
            TextWriter textWriter = new StreamWriter(@".Test.xml");
            serializer.Serialize(textWriter, f);
            Console.WriteLine(f);
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新