.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
相关产品推荐
相关产品推荐

