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

如何序列化含自定义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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 02:55:42