【问题标题】:c# Deserialization not working?c#反序列化不起作用?
【发布时间】:2011-05-09 00:10:31
【问题描述】:

我有一个测试控制台应用程序,我试图让序列化和反序列化工作以将数据存储到 xml 文件中。序列化方法正常工作,但反序列化似乎不起作用。它不会产生任何错误,但不会从 .xml 文件加载我的数据。有人知道为什么吗?

class Program
{
    static void Main(string[] args)
    {
        ArrayList siteList = new ArrayList();
        DeserializeArray();
        siteList.Add("Test 1");
        siteList.Add("Test 2");
        foreach (var item in siteList)
        {
            Console.WriteLine(item);
        }
        SerializeArray(siteList);
        if (siteList.Contains("Test 2"))
        {
            Console.WriteLine("Test 2 exists!");
            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;
    }
}

}

【问题讨论】:

    标签: c# serialization deserialization


    【解决方案1】:

    工作正常(已测试),Main() 中的逻辑已关闭 - 您必须在反序列化之前先进行序列化,试试这个:

    static void Main(string[] args)
    {
    
        ArrayList siteList = new ArrayList();
    
        siteList.Add("Test 1");
        siteList.Add("Test 2");
        foreach (var item in siteList)
        {
            Console.WriteLine(item);
        }
        SerializeArray(siteList);
        siteList = DeserializeArray();
        if (siteList.Contains("Test 2"))
        {
            Console.WriteLine("Test 2 exists!");
            Console.Read();
        }
    }
    

    【讨论】:

    • 这不会消除反序列化的全部意义吗?我认为反序列化从源中获取数据。我想添加到现有的.xml文件而不是每次都创建一个新的,所以我不应该先反序列化吗?
    • 如果你想添加到现有的 XML 是的,你可以先反序列化 - 但你必须将结果分配给变量 - 你没有这样做:ArrayList siteList = DeserializeArray();
    【解决方案2】:

    您的代码在这里运行良好。我假设您有上一次运行的 SiteList.xml,因为您首先要反序列化。为了清楚起见,我添加了 Console.WriteLine 来转储反序列化的数据。

    class Program
    {
        static void Main(string[] args)
        {
            ArrayList siteList = new ArrayList();
            ArrayList deserealizedArray = DeserializeArray();
            foreach (var item in deserealizedArray)
            {
                Console.WriteLine(item);
            }
            Console.WriteLine("---");
            siteList.Add("Test 1");
            siteList.Add("Test 2");
            foreach (var item in siteList)
            {
                Console.WriteLine(item);
            }
            SerializeArray(siteList);
            if (siteList.Contains("Test 2"))
            {
                Console.WriteLine("Test 2 exists!");
                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;
        }
    }
    

    【讨论】:

    • 此代码仅在 SiteList.xml 已存在时有效。你能修改它,让它在它不工作的时候工作吗?
    • 现在好像反序列化了,但是当新数据被序列化时,它没有添加到新的arraylist中吗?它会用新数据覆盖现有列表吗?有什么想法吗?
    • 是的,您正在代码中创建一个新列表并对其进行序列化。您需要更改代码,以便将元素添加到刚刚反序列化的列表中,然后序列化 that 列表。
    猜你喜欢
    • 1970-01-01
    • 2012-07-11
    • 2020-10-16
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多