如何写类接受任何...对象?

时间:2012-07-04 20:06:53

标签: c# .net

我有一个实例化的类来保存或加载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);
        }   
    }

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

3 个答案:

答案 0 :(得分:5)

您可以使用generic methods,例如

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);

答案 1 :(得分:2)

您可以使用BinaryFormatter代替XmlSerializer - 它将处理任何类型的任何对象图。

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

答案 2 :(得分: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);
    }
}