0

我正在制作一个 WPF 应用程序,在其中我保存我的 WPF 应用程序退出时的对象列表。并在系统启动时获取对象列表。最初一切正常。但有时它会给出序列化异常。得到异常后,我查看了 xml 序列化文件。但在我看来,抛出异常是因为 xml 文件的格式不正确。当我纠正它时。它再次运行良好。

public static class IsolatedStorageCacheManager<T>
{
    public static void store(T loc)
    {
        IsolatedStorageFile appStore = IsolatedStorageFile.GetStore(IsolatedStorageScope.User | IsolatedStorageScope.Assembly | IsolatedStorageScope.Domain, null, null);
        using(IsolatedStorageFileStream fileStream=appStore.OpenFile("myFile21.xml",FileMode.OpenOrCreate))
        {
            DataContractSerializer serializer = new DataContractSerializer(typeof(T));
            serializer.WriteObject(fileStream, loc);
        }
    }
    public static T retrieve()
    {
        T obj = default(T);
        IsolatedStorageFile appStore = IsolatedStorageFile.GetStore(IsolatedStorageScope.User | IsolatedStorageScope.Assembly | IsolatedStorageScope.Domain, null, null);
        if (appStore.FileExists("myFile21.xml"))
        {
            using (IsolatedStorageFileStream fileStream = appStore.OpenFile("myFile21.xml", FileMode.Open))
            {
                DataContractSerializer serializer = new DataContractSerializer(typeof(T));
                try
                {
                    obj = (T)serializer.ReadObject(fileStream);
                }
                catch (SerializationException e)
                {
                    Console.WriteLine(e.StackTrace);
                }
            }
        }
        return obj;
    }
}
4

1 回答 1

0

首先要做的是确保传递给的对象属于 DataContractSerializer 支持store的类型。

最简单的方法是自己检查所有store呼叫。

您还可以创建一种验证方法,甚至更好,看看是否有其他人已经实现了。此方法可以验证loc对象并返回 a并在System.Diagnostics.Debug.Assert调用内的方法boolean开头调用,以便它仅在调试配置上运行。请注意,尽管此方法可能非常棘手,因为您必须为规范中提到的所有情况验证类型 T,并且如果 T 是泛型,则还要验证 T 的参数。storeDataContractSerializer

于 2012-11-15T19:41:54.187 回答