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)の必要性は、このクラスに、それを必要とする可能性のあるすべてのクラスと、データを操作するための2つの特定のメソッドを提供する必要があることを意味します。
好き:

    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

BinaryFormatter-の代わりに使用できます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 に答える