如何序列化含自定义MyMatrix[,]类型字段的MyClass对象?
解决方案
你的代码存在两个核心问题:一是创建的JsonSerializerOptions配置未传递给序列化方法,导致私有字段myField无法被序列化;二是自定义类型MyMatrix没有对应的序列化逻辑,System.Text.Json无法识别处理。以下是具体解决步骤:
1. 修复序列化选项的传递问题
你当前代码中仅创建了包含IncludeFields = true的配置对象,但并未将其传入SerializeToUtf8Bytes方法,相当于该配置未生效。必须将配置作为参数传入序列化/反序列化方法,才能让程序识别并处理私有字段。
2. 为自定义类型MyMatrix实现JSON转换器
System.Text.Json仅支持内置类型和符合序列化约定的类型,自定义类型需要手动实现JsonConverter<MyMatrix>,定义该类型与JSON格式的互转逻辑。
假设MyMatrix的结构如下(你可根据实际结构调整):
public class MyMatrix { public int Rows { get; set; } public int Columns { get; set; } public double[,] Values { get; set; } }
对应的转换器实现:
public class MyMatrixConverter : JsonConverter<MyMatrix> { public override MyMatrix Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { using (JsonDocument doc = JsonDocument.ParseValue(ref reader)) { JsonElement root = doc.RootElement; return new MyMatrix { Rows = root.GetProperty("Rows").GetInt32(), Columns = root.GetProperty("Columns").GetInt32(), Values = JsonSerializer.Deserialize<double[,]>(root.GetProperty("Values").GetRawText(), options) }; } } public override void Write(Utf8JsonWriter writer, MyMatrix value, JsonSerializerOptions options) { writer.WriteStartObject(); writer.WriteNumber("Rows", value.Rows); writer.WriteNumber("Columns", value.Columns); writer.WritePropertyName("Values"); JsonSerializer.Serialize(writer, value.Values, options); writer.WriteEndObject(); } }
3. 配置转换器并完成序列化/反序列化逻辑
修改Save方法,传入配置好的选项(包含私有字段访问和自定义转换器),同时补充反序列化的Load方法:
internal class MyClass { private readonly MyMatrix[,] myField; // 修正原属性定义的语法错误 public MyMatrix[,] MyField { get => myField; } // 反序列化需要无参构造函数,或使用[JsonConstructor]标记指定构造函数 public MyClass() { } // 自定义构造函数,用于初始化对象 public MyClass(MyMatrix[,] matrix) { myField = matrix; } } public static class SerializationHelper { public static bool Save(MyClass o, string fileName) { var options = new JsonSerializerOptions { IncludeFields = true, WriteIndented = true // 可选,格式化JSON便于阅读 }; options.Converters.Add(new MyMatrixConverter()); try { byte[] jsonBytes = JsonSerializer.SerializeToUtf8Bytes(o, options); File.WriteAllBytes(fileName, jsonBytes); return true; } catch (Exception e) { Console.WriteLine("序列化异常: " + e.Message); return false; } } public static MyClass Load(string fileName) { var options = new JsonSerializerOptions { IncludeFields = true }; options.Converters.Add(new MyMatrixConverter()); try { byte[] jsonBytes = File.ReadAllBytes(fileName); return JsonSerializer.Deserialize<MyClass>(jsonBytes, options); } catch (Exception e) { Console.WriteLine("反序列化异常: " + e.Message); return null; } } }
关键说明
- 如果
MyMatrix的实际结构与示例不同,只需调整转换器中的读写逻辑,确保能正确映射该类型的所有必要属性。 - 反序列化时,
MyClass需要提供可访问的无参构造函数,或使用[JsonConstructor]特性标记用于反序列化的构造函数。 - 二维数组
[,]是System.Text.Json默认支持的类型,只要元素类型能被正常序列化(此处通过自定义转换器实现),即可自动处理。
内容的提问来源于stack exchange,提问作者Alexey
相关产品推荐
相关产品推荐

