到目前为止,我已经调试了它,列表有值…但是它并没有把它们写到文件中。
我不知道为什么它是空的。
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);
}
}
}