2

我有一个类,我实例化以保存或加载 xml 数据。

例如:

    serilizer = new ObjectSerializer();

    npcEntityData = serilizer.LoadNPCData(fileName);

去:

namespace TDIYCSharpLib
{
    public class ObjectSerializer
    {

        NPCBaseInfo NPC;
        MonsterBaseInfo monster;

        public void SaveNPCData(object objGraph, string fileName)
        {
            XmlSerializer xmlFormat = new XmlSerializer(typeof(NPCBaseInfo));

            using(Stream fileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None))
            {
                xmlFormat.Serialize(fileStream, objGraph);
            }
        }

        public NPCBaseInfo LoadNPCData(string fileName)
        {
            XmlSerializer xmlDeformat = new XmlSerializer(typeof(NPCBaseInfo));

            using (StreamReader fileStream = new StreamReader(fileName))
            {
                NPC = (NPCBaseInfo)xmlDeformat.Deserialize(fileStream);
            }

            return NPC;
        }

    }
}

这就像它所写的那样工作;然而,XmlSerializer 对 typeof(SomeClass) 的需求意味着我必须为这个类提供所有可能需要它的类以及两个特定的方法来操作数据。
喜欢:

    public void SaveMonsterData(object objGraph, string fileName)
    {
        XmlSerializer xmlFormat = new XmlSerializer(typeof(MonsterBaseInfo));

        using (Stream fileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None))
        {
            xmlFormat.Serialize(fileStream, objGraph);
        }   
    }

这是可行的,只是一些简单的复制和粘贴,但似乎是很多不必要的工作。

4

3 回答 3

5

您可以使用通用方法,例如

public void SaveMonsterData<T>(T objGraph, string fileName)
{
    XmlSerializer xmlFormat = new XmlSerializer(typeof(T));
    using (Stream fileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None))
    {
        xmlFormat.Serialize(fileStream, objGraph);
    }       
}

public T LoadMonsterData<T>(string fileName)
{
    XmlSerializer xmlDeformat = new XmlSerializer(typeof(T));

    T t;
    using (StreamReader fileStream = new StreamReader(fileName))
    {
        t = (T)xmlDeformat.Deserialize(fileStream);
    }

    return t;
}

如果您有一个名为 Npc 的类,您将使用如下方法:

Npc npc;
SaveMonsterData<Npc>(npc, fileName);
于 2012-07-04T20:08:26.677 回答
2

您可以使用 theBinaryFormatter而不是XmlSerializer- 它将处理任何类型的任何对象图。

这假定您不需要 XML 或可读的序列化格式。

于 2012-07-04T20:08:34.430 回答
0

在将对象作为 objGraph 参数传递之前,您是否对对象进行了任何操作?如果没有,这应该工作:

var MyNpcBaseInfoInstance = new NpcBaseInfo();
// ...
SaveAnyObject(MyNpcBaseInfoInstance, "file.xml");

public void SaveAnyObject(object objGraph, string fileName)
{
    XmlSerializer xmlFormat = new XmlSerializer(objGraph.GetType());

    using(Stream fileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None))
    {
            xmlFormat.Serialize(fileStream, objGraph);
    }
}
于 2012-07-04T20:24:49.727 回答