确保数据反序列化/序列化

时间:2015-07-29 13:00:16

标签: c# windows-phone-8.1

我在ObservableCollections中有3个ViewModel,在运行应用时我加载了ClassObservableCollections。 为确保if(SomeCollection.Count == 0) ThisCollection = await deserializationMethod<ObservableColletion<T>>(filename); 被反序列化,我得到了。

deserializationMethod

如果没有文件,return Activator.CreateInstance<T>(); 将使用

创建新对象
if(ClassObject.Loaded != true)
   ThisObject = await deserializationMethod<T>(filename);

工作正常 - 没问题。

我上课了

List

我添加了一个属性 - 如果文件被反序列化,那么它是真的。 看起来它有效,但事实并非如此。它很少发生,但有时文件没有反序列化,当你使用应用程序时,这个文件被覆盖,所以每个数据都被销毁。我找不到导致问题的原因。这就是你只是运行一个应用程序,它发生 - 就像每100次运行一次。

如何确定如果文件存在则会对其进行反序列化? 或者我可能会ObservableCollections + Class SemaphoreSlim并将其序列化为一个文件?这有什么好的做法吗?

修改

我使用BackPressed来确保所有内容都按照预期使用,但今天又发生了。

当应用程序启动并且没有其他任何东西被点击时,它就会发生。目前没有办法写一些东西。看起来数据没有反序列化或者没有读取存在的文件。因为每个更改都是通过关闭应用程序编写的,所以一切都消失了 任何其他想法可能是什么或如何确保数据被反序列化?

编辑最终 - 转载问题:

我终于复制了正在发生的事情。因此,我已使用此处不需要的代码删除了修改。

我有MainPage事件来处理用户何时返回或想要退出应用程序(如果在BackPressed上)。 这部分代码显然导致了这个问题。究竟是怎么回事。 首先,问题是不可能使用模拟器进行复制。 我的BackPressed方法包含等待序列化方法,该方法保存了后来消失的数据(因为Ondrej Svejdar写的是在阅读之前写的)。但是我开始测试它并且有奇怪的行为,我仍然有一些问题。

如何发生。

当我启动应用程序时(例如偶然)并且出现加载屏幕时,我开始轻按几次按钮 - &gt;应用程序没有运行它正在尽快关闭,我甚至无法看到用户界面(有时候我能够看到AppBar)。然后,当我再次尝试打开应用程序时(无论是立即还是稍后),它是&#34;恢复&#34;在这个确切的时刻之后我的数据消失了。但不是所有的数据。只有在ObservableCollections方法中等待保存的最后一个。只有这一个。无论有没有这个类,我都尝试保存一,二和三 @interface BBText : NSManagedObject @property (nonatomic, retain) NSDate * create_date; @property (nonatomic, retain) NSString * font; @property (nonatomic, retain) NSNumber * fontsize; @property (nonatomic, retain) NSDate * modify_date; @property (nonatomic, retain) NSString * text; @property (nonatomic, retain) NSString * text_color; @end ,并且总是保存最后一个&#34;空&#34;。在此等待之后,我得到了可能导致此问题的Application.Current.Exit()方法,但我不确定序列化方法任务时是否重要,只有最后一个错误地序列化

当我从BackPressed方法中移除此等待时,我无法重现此问题,所以就是这样。

我仍然有的问题是:这种行为是否可以预期?有没有更好的方法来关闭应用程序并确保序列化数据,或者我应该在使用应用程序时保存它而不是在退出时?

1 个答案:

答案 0 :(得分:0)

如果有人对如何正确地做到这一点感兴趣我正在思考它并得出一些结论。 请记住,这是我的建议,可能有更好的方法。

在处理 BackPressedButton 事件(硬件事件)时,我有一个 GoBack 到前一页的实现(如果没有在 MainPage 上)或者离开如果在MainPage上的应用程序。 我正在使用 Application.Current.Exit()关闭一个应用程序,这并没有导致问题(因为我保存了非常小的文件),直到我开始做一些奇怪的事情(阅读& #34; EDIT FINAL - 转载问题:&#34; 的问题更多细节)。 事情是文件没有保存,因为在写完成之前应用程序已关闭。解决方案实际上非常简单。对于任务保存方法,在写完成后应该返回 true 值,并在关闭应用时检查此值。

bool saved = await saveDataAsync<T>(whichData, dataFileName)
     if(saved)
         Application.Current.Exit();

和序列化方法看起来像这样(我使用semaphoreSlim,以防两种方法有可能尝试访问同一个文件)

    public async Task<bool> saveDataAsync<T>(T whichData, string dataFileName)
    {
        var Serializer = new DataContractSerializer(typeof(T));
        await mySemaphoreSlim.WaitAsync();
        try
        {
            using (var stream = await ApplicationData.Current.LocalFolder.OpenStreamForWriteAsync(dataFileName, CreationCollisionOption.ReplaceExisting))
            {
                Serializer.WriteObject(stream, whichData);
            }
        }
        finally
        {
            mySemaphoreSlim.Release();
        }
        return true;
    }