.NET MAUI中如何用Preferences保存Audioguia对象列表?
可行性分析与解决方案
首先,用.NET MAUI的Preferences保存对象列表完全可行,核心思路就是将对象序列化为JSON字符串存储,读取时反序列化回来。你的代码思路是对的,没成功大概率是细节没处理到位,以下是具体问题排查和修正方案:
可能的问题点
- 未安装
Newtonsoft.JsonNuGet包:你的代码用到了JsonConvert,但.NET MAUI默认不包含这个库,需要手动安装对应包。 - 缺乏异常处理:序列化/反序列化过程中如果出现格式错误、空值等情况,没有捕获异常会直接导致功能失效。
- 未做重复判断:添加时可能会存入重复的
Audioguia对象。
修正后的实现方案
方案1:基于Newtonsoft.Json实现
- 先通过NuGet安装
Newtonsoft.Json包 - 调整代码,添加异常处理和重复校验:
using Newtonsoft.Json; using System.Collections.Generic; using System.Linq; using Microsoft.Maui.Storage; [Serializable] public class Audioguia { public int Id { get; set; } public string Name { get; set; } public string Direction { get; set; } public string Image { get; set; } } public class AudioguiaService { private const string KeyAudioguias = "Audioguias"; public List<Audioguia> GetAudioguias() { try { if (Preferences.ContainsKey(KeyAudioguias)) { string audioguiaJson = Preferences.Get(KeyAudioguias, string.Empty); if (!string.IsNullOrEmpty(audioguiaJson)) { return JsonConvert.DeserializeObject<List<Audioguia>>(audioguiaJson); } } } catch (JsonException) { // 遇到无效JSON时清空存储,避免后续读取失败 Preferences.Remove(KeyAudioguias); } return new List<Audioguia>(); } public void AddAudioguia(Audioguia audioguia) { if (audioguia == null) return; List<Audioguia> audioguias = GetAudioguias(); // 根据Id避免重复添加 if (!audioguias.Any(a => a.Id == audioguia.Id)) { audioguias.Add(audioguia); try { string audioguiaJson = JsonConvert.SerializeObject(audioguias); Preferences.Set(KeyAudioguias, audioguiaJson); } catch (JsonException) { // 可添加日志记录序列化异常 } } } }
方案2:使用.NET MAUI内置System.Text.Json(无需额外NuGet)
如果不想依赖第三方库,推荐用内置的序列化工具,更轻量:
using System.Collections.Generic; using System.Linq; using System.Text.Json; using Microsoft.Maui.Storage; public class Audioguia { public int Id { get; set; } public string Name { get; set; } public string Direction { get; set; } public string Image { get; set; } } public class AudioguiaService { private const string KeyAudioguias = "Audioguias"; private readonly JsonSerializerOptions _jsonOptions = new() { PropertyNameCaseInsensitive = true, // 反序列化时忽略大小写 WriteIndented = true // 可选,格式化JSON方便调试查看 }; public List<Audioguia> GetAudioguias() { try { if (Preferences.ContainsKey(KeyAudioguias)) { string audioguiaJson = Preferences.Get(KeyAudioguias, string.Empty); if (!string.IsNullOrEmpty(audioguiaJson)) { return JsonSerializer.Deserialize<List<Audioguia>>(audioguiaJson, _jsonOptions); } } } catch (JsonException) { Preferences.Remove(KeyAudioguias); } return new List<Audioguia>(); } public void AddAudioguia(Audioguia audioguia) { if (audioguia == null) return; List<Audioguia> audioguias = GetAudioguias(); if (!audioguias.Any(a => a.Id == audioguia.Id)) { audioguias.Add(audioguia); try { string audioguiaJson = JsonSerializer.Serialize(audioguias, _jsonOptions); Preferences.Set(KeyAudioguias, audioguiaJson); } catch (JsonException) { // 日志记录异常 } } } }
额外注意事项
Preferences适合存储小到中等规模的数据,如果你的有声导览列表条目过多(比如上百条带大量文本),建议改用本地文件存储(写入JSON文件到FileSystem.AppDataDirectory目录)。- 确保
Audioguia类的所有属性都是可序列化的,不要包含UI控件、未标记序列化的复杂对象等无法被JSON序列化的类型。 - 可扩展添加删除、更新方法,逻辑和添加一致:读取列表→修改内容→重新序列化存储。
内容的提问来源于stack exchange,提问作者Anxo Gómez
相关产品推荐
相关产品推荐

