【问题标题】:Serialize/Deserialize System.Drawing.Color with System.Text.Json使用 System.Text.Json 序列化/反序列化 System.Drawing.Color
【发布时间】:2021-12-08 09:01:32
【问题描述】:

问题是用Color 从System.Drawing.Color 和System.Text.Json 序列化/反序列化一个类。

public class Test
{
    public Color Farbe { get; set; }
    public IEnumerable<Color> Farben { get; set; }
}

序列化

File.WriteAllText("data.json", JsonSerializer.Serialize(test));

没有任何转换器,序列化的 json 文件如下所示:

{
  "Farbe": {
    "R": 255,
    "G": 0,
    "B": 0,
    "A": 255,
    "...": "...",
    "Name":" Red"
  },
  "Farben": [
    {
      "R":255,
      "G":0,
      "B":0,
      "A":255,
      "...": "...",
      "Name":"Red"
    },
    {
      "R":0,
      "G":128,
      "B":0,
      "A":255,
      "...": "...",
      "Name":"Green"
    }
  ]
}

无法进行反序列化。结果将为空:

Test test2 = JsonSerializer.Deserialize<Test>(File.ReadAllText("data.json"));

Console.WriteLine($"{test2.Farbe.R}:{test2.Farbe.G}:{test2.Farbe.B}");
Console.WriteLine(string.Join(',', test2.Farben));

结果

0:0:0
Color [Empty],Color [Empty],Color [Empty]

【问题讨论】:

标签: c# json serialization deserialization system.drawing.color


【解决方案1】:

经过一番搜索,我找到了解决方案并获得了System.Drawing.Color 的转换器:

public class ColorJsonConverter : JsonConverter<Color>
{
    public override Color Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) => ColorTranslator.FromHtml(reader.GetString());

    public override void Write(Utf8JsonWriter writer, Color value, JsonSerializerOptions options) => writer.WriteStringValue("#" + value.R.ToString("X2") + value.G.ToString("X2") + value.B.ToString("X2").ToLower());
}

使用转换器,序列化/反序列化工作正常。

Test test = new()
{
    Farbe = Color.Red,
    Farben = new List<Color>()
    {
        Color.Red,
        Color.Green,
        Color.Blue
    }
};

var options = new JsonSerializerOptions()
{
    Converters = {
        new ColorJsonConverter()
    }
};

File.WriteAllText("data.json", JsonSerializer.Serialize(test, options));

Test test2 = JsonSerializer.Deserialize<Test>(File.ReadAllText("data.json"), options);

Console.WriteLine($"{test2.Farbe.R}:{test2.Farbe.G}:{test2.Farbe.B}");
Console.WriteLine(string.Join(',', test2.Farben));

结果

255:0:0
Color [A=255, R=255, G=0, B=0],Color [A=255, R=0, G=128, B=0],Color [A=255, R=0, G=0, B=255]

【讨论】:

  • 谢谢!非常有帮助,遇到了 FileInfo、DirectoryInfo 的问题。我找不到一个很好的例子。
猜你喜欢
  • 2021-12-30
  • 2021-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多