![](/img/trans.png)
[英]XmlSerializer.Deserialize doesn't work with the base class even with XmlInclude
[英]XmlSerializer.Deserialize() Does not appear to work
據我所知,我能夠以 XML UTF-8 格式成功序列化和保存數據,但是,我無法反序列化相同的數據。
我試過研究這個問題,但是,似乎沒有人有同樣的問題,只是反序列化不起作用。 這就是我認為至少是問題所在。
public static class XMLManager
{
//Save Function
public static void SaveItemsUTF(ItemDatabase itemDB)
{
XmlSerializer serializer = new XmlSerializer(typeof(ItemDatabase));
string filename = Application.dataPath + "/StreamingFiles/XML/item_data.xml";
Encoding encoding = Encoding.GetEncoding("UTF-8");
using (StreamWriter stream = new StreamWriter(filename, false, encoding))
{
serializer.Serialize(stream, itemDB);
}
}
//Load Function
public static void LoadItems(ItemDatabase itemDB)
{
//Open an XML File
if (File.Exists(Application.dataPath + "/StreamingFiles/XML/item_data.xml"))
{
XmlSerializer serializer = new XmlSerializer(typeof(ItemDatabase));
FileStream stream = new FileStream(Application.dataPath + "/StreamingFiles/XML/item_data.xml", FileMode.Open);
itemDB = serializer.Deserialize(stream) as ItemDatabase;
stream.Close();
}
else
{
Debug.LogError("File not found!");
}
}
//Delete Function
public static void DeleteItems()
{
//Delete an XML File
File.Delete(Application.dataPath + "/StreamingFiles/XML/item_data.xml");
}
}
[System.Serializable]
public class ItemEntry
{
public string ItemName;
public SaveMaterial material;
public int Value;
}
[System.Serializable]
public class ItemDatabase
{
[XmlArray("CombatEquipment")]
public List<ItemEntry> list = new List<ItemEntry>();
}
public enum SaveMaterial
{
Wood,
Copper,
Iron,
Steel,
Obsidian
}
當我使用 SaveItemsUTF 方法時,它成功地在正確的位置生成了一個包含正確格式的測試數據的文件,可以在此處看到: https://imgur.com/a/5PJMTRh
但是,當我使用 LoadItems 方法時,似乎什么也沒發生。 控制台中沒有錯誤或日志。 沒有數據被加載。 它似乎什么也沒做。 我被正式卡住了。
它是反序列化的。 您可以放置斷點並查看 LoadItems 中的元素填充了正確的數據。
但現在的問題是關於值/引用類型在 .NET 中的工作方式。 您不能從使用它的方法更改值(重新分配引用,itemDB 在方法中指向哪個;您可以更改其中的數據,但這是其他主題) 。 嚴格來說,“ object 是通過引用傳遞給方法的,而引用本身是通過值傳遞的;如果確實需要在方法中重新分配引用,請為此使用修飾符”。
所以要么使用 ref/out 修飾符(正如 BrettCaswell 在評論部分指出的那樣,out 是首選;這是說“內容通過引用傳遞並將在內部重新分配”的方式,而 ref 表示“內容通過引用傳遞並且可能是重新分配內部”):
public static void LoadItems(out ItemDatabase itemDB); // will work; but you'll call it as below, with out modifier:
// XMLManager.LoadItems(out itemDBName);
或更改為:
public static ItemDatabase LoadItems(); // also will work, but, of course, you'll need to create ItemDatabase internally in LoadItems
.NET 封裝了 TryParse 方法來解決解析數據和為解析提供狀態的類似任務); 這是 integer(值類型)的示例: https://docs.microsoft.com/en-us/dotnet/api/system.int32.tryparse?view=netframework-4.8
您可以使用泛型類型函數,它使您的代碼可重用於其他 object 類型。 我無法檢查我的代碼,所以它可能會出現一些錯誤。
static void Serialize<T>(T data, string path)
{
FileStream fs = new FileStream(path, FileMode.Create);
XmlSerializer serializer = new XmlSerializer(typeof(T));
serializer.Serialize(fs, data);
fs.Close();
}
static T Deserialize<T>(string path)
{
FileStream fs = new FileStream(path, FileMode.Open);
XmlSerializer xs = new XmlSerializer(typeof(T));
T obj = (T)xs.Deserialize(fs);
fs.Close();
return obj;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.