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

.NET MAUI序列化LocalFile集合遇对象循环及数值异常问题求助

解决ObservableObject子类Json序列化异常的方法

问题根源

你的Project和LocalFile继承自ObservableObject(通常来自CommunityToolkit.Mvvm),这个基类内部包含INotifyPropertyChanged的实现逻辑(比如PropertyChanged事件、相关字段),序列化时这些内部成员会被遍历:

  • 首次序列化时,框架检测到基类成员的引用关系,误判为循环引用或对象深度超限;
  • 添加ReferenceHandler.Preserve后,基类内部的某些特殊成员(如事件订阅、未兼容JSON的数值类型)触发了ArgumentException。

可行解决方案

1. 使用DTO(数据传输对象)序列化(推荐)

创建只包含需要序列化属性的DTO类,完全避开基类的干扰,这是最稳妥的方案:

// 定义DTO类
public class LocalFileDto
{
    public string Name { get; set; }
    public string FilePath { get; set; }
}

// 序列化时转换原对象到DTO
var filesDto = project.LocalFiles.Select(f => new LocalFileDto 
{ 
    Name = f.Name, 
    FilePath = f.FilePath 
}).ToList();

string json = JsonSerializer.Serialize(filesDto);

2. 自定义JsonConverter过滤序列化属性

如果不想创建DTO,可以自定义转换器,只序列化你需要的属性:

public class LocalFileConverter : JsonConverter<LocalFile>
{
    public override LocalFile Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        // 若不需要反序列化,可抛出NotImplementedException
        throw new NotImplementedException();
    }

    public override void Write(Utf8JsonWriter writer, LocalFile value, JsonSerializerOptions options)
    {
        writer.WriteStartObject();
        writer.WriteString("name", value.Name);
        writer.WriteString("filePath", value.FilePath);
        writer.WriteEndObject();
    }
}

// 使用转换器序列化
var options = new JsonSerializerOptions();
options.Converters.Add(new LocalFileConverter());
string json = JsonSerializer.Serialize(project.LocalFiles, options);

3. 调整JsonSerializerOptions忽略基类干扰

通过配置选项过滤基类的不必要成员,但兼容性可能不如前两种方案:

var options = new JsonSerializerOptions
{
    ReferenceHandler = ReferenceHandler.IgnoreCycles, // 忽略循环引用,而非保留
    MaxDepth = 128, // 增大深度限制
    IgnoreReadOnlyProperties = true, // 忽略基类的只读属性
    IgnoreFields = true // 忽略基类的事件字段
};

string json = JsonSerializer.Serialize(project.LocalFiles, options);

内容的提问来源于stack exchange,提问作者Joao Lima

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 07:53:18