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
}
}