2012-07-04 39 views
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); 
     } 
    } 

這是可行的,只是一些簡單的複製和粘貼,但好像很多不必要的工作。

回答

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

感謝您,您的第一篇文章是我需要得到它運行踢你的編輯證實了它。 – Dialock

2

可以使用BinaryFormatter代替XmlSerializer - 它會處理任何類型的任何對象圖。

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

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); 
    } 
} 
相關問題