using System; using System.Collections.Generic; using System.IO; using System.Text.Json; using System.Text.Json.Serialization; using System.Windows; using XP.ImageProcessing.RoiControl.Models; namespace XP.ImageProcessing.RoiControl { /// /// ROI序列化工具类 /// public static class ROISerializer { private static readonly JsonSerializerOptions Options = new JsonSerializerOptions { WriteIndented = true, Converters = { new PointConverter(), new ROIShapeConverter() } }; /// /// 保存ROI列表到JSON文件 /// public static void SaveToFile(IEnumerable roiList, string filePath) { var json = JsonSerializer.Serialize(roiList, Options); File.WriteAllText(filePath, json); } /// /// 从JSON文件加载ROI列表 /// public static List LoadFromFile(string filePath) { var json = File.ReadAllText(filePath); return JsonSerializer.Deserialize>(json, Options) ?? new List(); } /// /// 序列化ROI列表为JSON字符�? /// public static string Serialize(IEnumerable roiList) { return JsonSerializer.Serialize(roiList, Options); } /// /// 从JSON字符串反序列化ROI列表 /// public static List Deserialize(string json) { return JsonSerializer.Deserialize>(json, Options) ?? new List(); } } /// /// Point类型的JSON转换�? /// public class PointConverter : JsonConverter { public override Point Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.StartObject) throw new JsonException(); double x = 0, y = 0; while (reader.Read()) { if (reader.TokenType == JsonTokenType.EndObject) return new Point(x, y); if (reader.TokenType == JsonTokenType.PropertyName) { string? propertyName = reader.GetString(); reader.Read(); switch (propertyName) { case "X": x = reader.GetDouble(); break; case "Y": y = reader.GetDouble(); break; } } } throw new JsonException(); } public override void Write(Utf8JsonWriter writer, Point value, JsonSerializerOptions options) { writer.WriteStartObject(); writer.WriteNumber("X", value.X); writer.WriteNumber("Y", value.Y); writer.WriteEndObject(); } } /// /// ROIShape多态类型的JSON转换�? /// public class ROIShapeConverter : JsonConverter { public override ROIShape? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { using (JsonDocument doc = JsonDocument.ParseValue(ref reader)) { var root = doc.RootElement; if (!root.TryGetProperty("ROIType", out var typeElement)) throw new JsonException("Missing ROIType property"); var roiType = (ROIType)typeElement.GetInt32(); return roiType switch { ROIType.Polygon => JsonSerializer.Deserialize(root.GetRawText(), options), _ => throw new JsonException($"Unknown ROIType: {roiType}") }; } } public override void Write(Utf8JsonWriter writer, ROIShape value, JsonSerializerOptions options) { JsonSerializer.Serialize(writer, value, value.GetType(), options); } } }