簡體   English   中英

XmlSerializer.Deserialize() 似乎不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM