【问题标题】:Serializing and deserializing a list of objects in a Windows Phone 8 app序列化和反序列化 Windows Phone 8 应用程序中的对象列表
【发布时间】:2013-07-07 17:57:21
【问题描述】:

给定一些对象列表:

List<Car> carlist = new List<Car>();

如何将此列表序列化为 XML 或二进制文件并将其反序列化?

到目前为止我有这个,但它不起作用。

//IsolatedStorageFile isFile = IsolatedStorageFile.GetUserStoreForApplication();
//IsolatedStorageFileStream ifs = new IsolatedStorageFileStream("myxml.xml", FileMode.Create,isFile);
//DataContractSerializer ser = new DataContractSerializer();
//XmlWriter writer = XmlWriter.Create(ifs);
//ser.WriteObject(writer, carlist);

【问题讨论】:

  • 如果它不起作用,您需要说明它对您不起作用的原因。你在期待什么?实际发生了什么?等等……

标签: windows-phone-8


【解决方案1】:

我正在使用这些方法将 XML 文件保存和加载到独立存储中:

public static class IsolatedStorageOperations
{
    public static async Task Save<T>(this T obj, string file)
    {
        await Task.Run(() =>
            {
                IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication();
                IsolatedStorageFileStream stream = null;

                try
                {
                    stream = storage.CreateFile(file);
                    XmlSerializer serializer = new XmlSerializer(typeof (T));
                    serializer.Serialize(stream, obj);
                }
                catch (Exception)
                {
                }
                finally
                {
                    if (stream != null)
                    {
                        stream.Close();
                        stream.Dispose();
                    }
                }
            });
    }

    public static async Task<T> Load<T>(string file)
    {

        IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication();
        T obj = Activator.CreateInstance<T>();

        if (storage.FileExists(file))
        {
            IsolatedStorageFileStream stream = null;
            try
            {
                stream = storage.OpenFile(file, FileMode.Open);
                XmlSerializer serializer = new XmlSerializer(typeof (T));

                obj = (T) serializer.Deserialize(stream);
            }
            catch (Exception)
            {
            }
            finally
            {
                if (stream != null)
                {
                    stream.Close();
                    stream.Dispose();
                }
            }
            return obj;
        }
        await obj.Save(file);
        return obj;
    }
}

您可以在 catch() 中自定义错误处理。

此外,您可以根据需要调整 Load 方法,在我的情况下,我试图从文件加载,如果不存在,它会创建一个默认值并放置根据提供的类型的默认序列化对象构造函数。

更新:

假设您有汽车清单:

List&lt; Car &gt; carlist= new List&lt; Car &gt;();

要保存,您可以将它们称为 await carlist.Save("myXML.xml"); ,因为它是异步的Task(async)。

要加载,var MyCars = await IsolatedStorageOperations.Load&lt; List&lt; Car&gt; &gt;("myXML.xml").(我想,我还没有像这样使用它,作为一个列表到目前为止......

【讨论】:

    【解决方案2】:

    DataContactJsonSerializer 的性能优于 XmlSerializer。它会创建较小的文件并处理好属性内的列表。

    【讨论】:

    • 你能提供一些例子或参考吗?
    • @waghekapil:根据我自己的经验。您可以尝试使用 List 的内部属性来序列化对象,它会被 XmlSerializer 跳过。还有关于大小 - 一般来说,XML 的结构比 JSON 更大。
    • 谢谢!我已经通过 DataContactJsonSerializer 完成了 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    • 2014-12-24
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多