using Newtonsoft.Json; // 注意:如果不想依赖 Newtonsoft,也可以用 System.Text.Json,但 Newtonsoft 在 Std 2.0 中兼容性更好 namespace SHH.Contracts { /// /// 视频数据传输契约(纯净版 POCO) /// public class VideoPayload { /// /// 构造函数 /// public VideoPayload() { SubscriberIds = new List(16); Diagnostics = new Dictionary(4); } #region --- 1. 元数据 (Metadata) --- public string CameraId { get; set; } = string.Empty; /// 采集时间戳 (Unix 毫秒) public long CaptureTimestamp { get; set; } /// 分发时间戳 (Unix 毫秒) public long DispatchTimestamp { get; set; } /// 原始图像宽度 public int OriginalWidth { get; set; } /// 原始图像高度 public int OriginalHeight { get; set; } /// 目标图像宽度 public int TargetWidth { get; set; } /// 目标图像高度 public int TargetHeight { get; set; } /// 订阅Ids public List SubscriberIds { get; set; } /// 诊断信息 public Dictionary Diagnostics { get; set; } /// /// 指示标志:是否存在原始图 /// public bool HasOriginalImage { get; set; } /// /// 指示标志:是否存在处理图 /// public bool HasTargetImage { get; set; } #endregion #region --- 2. 二进制数据 (Binary) --- // 标记 JsonIgnore,防止被错误序列化 [JsonIgnore] public byte[]? OriginalImageBytes { get; set; } [JsonIgnore] public byte[]? TargetImageBytes { get; set; } #endregion #region --- 3. 辅助方法 (仅保留 JSON 逻辑) --- /// /// 获取纯元数据的 JSON 字符串 /// public string GetMetadataJson() { // 在序列化前自动更新标志位,防止逻辑不同步 HasOriginalImage = (OriginalImageBytes != null && OriginalImageBytes.Length > 0); HasTargetImage = (TargetImageBytes != null && TargetImageBytes.Length > 0); return JsonConvert.SerializeObject(this); } public static VideoPayload? FromMetadataJson(string json) { return JsonConvert.DeserializeObject(json); } #endregion } }