【问题标题】:Serialize Json / Web Services to Observable Collection Model将 Json / Web 服务序列化为可观察集合模型
【发布时间】:2016-05-24 14:24:18
【问题描述】:

我想问一下,所以我使用了一个 Web 服务 api,然后将其序列化为模型的可观察集合。

我的问题是如何在任何地方使用这个可观察的集合,这样我就不必每次都从网络服务调用/获取/使用?

所以只需调用一次api,然后每次都可以使用数据而无需再次调用api吗?

谢谢

【问题讨论】:

    标签: web-services win-universal-app windows-10 observablecollection uwp


    【解决方案1】:

    正如上面提到的@thang,有很多方法可以将数据存储在应用程序中,以消除每次调用网络服务。

    我会建议你我这样做的方式:

    1.当我从 Web Api 检索 JSON 数据时,我将其解析为 Observable Collection:

        ObservableCollection<User> usersList = JsonConvert.DeserializeObject<ObservableCollection<User>>(responseJson).Users;
    

    2.一旦我有了我的列表,我还可以将序列化对象(JSON 格式)保存到文本文件中(记住 JSON 与字符串完全不同):

    private async void saveUsersToFile(string serializedUsersListAsJson)
    {
      StorageFolder storageFolder = ApplicationData.Current.LocalFolder;
      StorageFile usersFile = await storageFolder.CreateFileAsync("users.txt", CreationCollisionOption.OpenIfExists);
      await FileIO.WriteTextAsync(usersFile, serializedUsersListAsJson);
    }
    

    即使应用程序关闭并重新启动,此步骤也允许您存储数据。

    3.当您启动应用程序时,您可以调用以下方法从文件中读取数据:

    private async void retrieveNotes()
    {
      StorageFolder storageFolder = ApplicationData.Current.LocalFolder;
      StorageFile usersFile = await storageFolder.CreateFileAsync("users.txt", CreationCollisionOption.OpenIfExists) 
      string serializedUsersList = await FileIO.ReadTextAsync(usersFile );
    
      // Deserialize JSON list to the ObservableCollection:
        if(serializedUsersList!=null)
         {
           var usersList= JsonConvert.DeserializeObject<ObservableCollection<User>>(serializedUsersList);
         } 
    

    4.最后一步是在您需要使用它的Pages中声明Observable Collection字段。例如,如果您需要在页面之间传递此列表,您可以使用:

    Frame.Navigate(typeof(MainPage), usersList);
    

    记得在应用启动后从文件中读取数据。之后,您可以在应用程序运行时使用它。我的建议是每次连接 Web Api 以检索新数据时缓存数据。

    希望这会有所帮助。如果您想了解有关数据存储的更多信息,请阅读我博客上的以下帖子:

    https://mobileprogrammerblog.wordpress.com/2016/05/23/universal-windows-10-apps-data-storage/

    【讨论】:

    • 谢谢你的解决方案
    【解决方案2】:

    为下次用户打开应用保存数据

    将数据存储在本地Sqlite数据库中,或将集合序列化为本地文件以备后用。

    使用同一节中的数据

    将数据存储在一个通用对象中,每次需要初始化 ViewModel 时检索它

    在 Win 10 设备上使用数据

    • 将文件/数据库存储在 OneDrive 中并在需要时同步
    • 如果数据量很小,并且您不需要 100% 同步数据,请将其存储在漫游文件夹中

    【讨论】:

    • 如果我想在不同的部分/页面中使用怎么办?我也应该使用 sqlite 吗?
    • 如果你想在多个部分/页面中使用集合,只需将数据保存在可以从这些部分访问的对象中 -> 即一个名为“缓存”的静态类,它包含对此的引用收藏。这是 waht @thang2410199,意思是“将数据存储在一个通用对象中 [...]”。
    • 嗨,我的意思大致是这样,但我把实现留给你去做。
    • 我不知道什么是通用对象并创建它。你有这样做的参考吗?对不起,我是 C# 的新手,谢谢先生的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    • 2013-12-03
    相关资源
    最近更新 更多