You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET MAUI中如何用Preferences保存Audioguia对象列表?

可行性分析与解决方案

首先,用.NET MAUI的Preferences保存对象列表完全可行,核心思路就是将对象序列化为JSON字符串存储,读取时反序列化回来。你的代码思路是对的,没成功大概率是细节没处理到位,以下是具体问题排查和修正方案:

可能的问题点

  • 未安装Newtonsoft.Json NuGet包:你的代码用到了JsonConvert,但.NET MAUI默认不包含这个库,需要手动安装对应包。
  • 缺乏异常处理:序列化/反序列化过程中如果出现格式错误、空值等情况,没有捕获异常会直接导致功能失效。
  • 未做重复判断:添加时可能会存入重复的Audioguia对象。

修正后的实现方案

方案1:基于Newtonsoft.Json实现

  1. 先通过NuGet安装Newtonsoft.Json包
  2. 调整代码,添加异常处理和重复校验:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 08:37:40