Deserializing but not adding to previous xml

笑着哭i 提交于 2019-12-13 05:39:38

问题


In relation to my other question, I have serialized data and then deserialized it, but when I write new data to the deserialized arraylist, it does not add the new data to the end of the arraylist. Instead it is overwriting previous list data. Any help would be great. Here's my code so far:

    {
        ArrayList siteList = new ArrayList();
        ArrayList copy = new ArrayList(siteList);

        //if previous data exists, deserialize it
        try
        {
            ArrayList deserializedArray = DeserializeArray();

            foreach (var item in deserializedArray)
            {
                Console.WriteLine(item);
            }
            Console.WriteLine("------");
        }
        catch
        {
            Console.WriteLine("No previous data found");
        }
        siteList.Add("Test 3");
        siteList.Add("Test 4");

        //Display all current items in list
        foreach (var item in siteList)
        {
            Console.WriteLine(item);
        }
        SerializeArray(siteList);
        Console.Read();
    }

    public static void SerializeArray(ArrayList siteList)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(ArrayList));
        TextWriter textWriter = new StreamWriter("SiteList.xml");
        serializer.Serialize(textWriter, siteList);
        textWriter.Close();
    }

    static ArrayList DeserializeArray()
    {
        XmlSerializer deserializer = new XmlSerializer(typeof(ArrayList));
        TextReader textReader = new StreamReader("SiteList.xml");
        ArrayList siteList;
        siteList = (ArrayList)deserializer.Deserialize(textReader);
        textReader.Close();

        return siteList;
    }
}

}


回答1:


You never actually assign the data from the deserialized arraylist to siteList which is the variable that you try to update later - assign it directly:

ArrayList siteList = DeserializeArray();

and update your DeserializeArray() method to take care of the case that no prior XML exists:

static ArrayList DeserializeArray()
{
    if(!File.Exists("SiteList.xml"))
        return new ArrayList();

    XmlSerializer deserializer = new XmlSerializer(typeof(ArrayList));
    TextReader textReader = new StreamReader("SiteList.xml");
    ArrayList siteList = (ArrayList)deserializer.Deserialize(textReader);
    textReader.Close();

    return siteList;
}

In general it is a bad idea to control flow with exceptions, especially in this case when you can just check whether the file exists or not.

The final method would look something like this then (some fluff removed):

static void Main(string[] args)
{
    ArrayList siteList = DeserializeArray();
    siteList.Add("Test 3");
    siteList.Add("Test 4");
    foreach (var item in siteList)
    {
        Console.WriteLine(item);
    }
    SerializeArray(siteList);
    Console.Read();
}


来源:https://stackoverflow.com/questions/5931484/deserializing-but-not-adding-to-previous-xml

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!