using System; using System.Collections.Generic; 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; } /// /// 采集时间戳 (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; } public List SubscriberIds { get; } public Dictionary Diagnostics { get; } /// /// 指示标志:是否存在原始图 /// 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() { // 在序列化前自动更新标志位,防止逻辑不同步 this.HasOriginalImage = (OriginalImageBytes != null && OriginalImageBytes.Length > 0); this.HasTargetImage = (TargetImageBytes != null && TargetImageBytes.Length > 0); return JsonConvert.SerializeObject(this); } public static VideoPayload FromMetadataJson(string json) { return JsonConvert.DeserializeObject(json); } #endregion } }