using Newtonsoft.Json; using System; using System.ComponentModel; using System.Linq; using System.Runtime.CompilerServices; using System.Security.Cryptography; using System.Text; /// /// 网络同步数据基类 2022.5.27 gwang /// public abstract class Base_NetSyncData : INetSyncData, INotifyPropertyChanged { [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] protected class JsonRawAttribute : Attribute { } public Base_NetSyncData() => this.PropertyChanged += (s, e) => IsChanged = true; [JsonIgnore] public virtual bool IsChanged { get; private set; } public event PropertyChangedEventHandler? PropertyChanged; protected void NotifyPropertyChanged([CallerMemberName] string propertyName = "") => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); /// 需要在actor线(协)程内部调用才安全 public virtual void ClearChanges() => this.IsChanged = false; /// /// 序列化为json串 /// virtual public string Json() => JsonConvert.SerializeObject(this); public override string ToString() { return this.Json(); } /// /// 计算自身数据(序列化为json串后)的MD5值 /// /// 是否转为小写字符串,默认:false virtual public string Md5(bool tolower = false) { var sb = new StringBuilder(); var md5 = MD5.Create(); byte[] hash = md5.ComputeHash(Encoding.UTF8.GetBytes(Json())); // 计算MD5的值 hash.ToList().ForEach(i => sb.Append(tolower ? $"{i:x2}" : $"{i:X2}")); // 转为32位16进制字大写(或者小写)符串 return sb.ToString(); } }