using MessagePack; using Newtonsoft.Json; using System.Collections.Generic; // 注意:如果不想依赖 Newtonsoft,也可以用 System.Text.Json,但 Newtonsoft 在 Std 2.0 中兼容性更好 namespace SHH.Contracts { /// /// 视频数据传输契约(纯净版 POCO) /// [MessagePackObject] public class VideoPayload { public VideoPayload() { SubscriberIds = new List(16); Diagnostics = new Dictionary(4); } #region --- 1. 元数据 (Metadata) --- [Key(0)] public string CameraId { get; set; } /// /// 采集时间戳 (Unix 毫秒) /// [Key(1)] public long CaptureTimestamp { get; set; } /// /// 分发时间戳 (Unix 毫秒) /// [Key(2)] public long DispatchTimestamp { get; set; } [Key(3)] public int OriginalWidth { get; set; } [Key(4)] public int OriginalHeight { get; set; } [Key(5)] public int TargetWidth { get; set; } [Key(6)] public int TargetHeight { get; set; } [Key(7)] public List SubscriberIds { get; set; } [Key(8)] public Dictionary Diagnostics { get; set; } /// /// 指示标志:是否存在原始图 /// [Key(9)] public bool HasOriginalImage { get; set; } /// /// 指示标志:是否存在处理图 /// [Key(10)] public bool HasTargetImage { get; set; } #endregion #region --- 2. 二进制数据 (Binary) --- // 标记 JsonIgnore,防止被错误序列化 [JsonIgnore] [IgnoreMember] public byte[] OriginalImageBytes { get; set; } [JsonIgnore] [IgnoreMember] 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 } }