Base_NetSyncData.cs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. using Newtonsoft.Json;
  2. using System;
  3. using System.ComponentModel;
  4. using System.Linq;
  5. using System.Runtime.CompilerServices;
  6. using System.Security.Cryptography;
  7. using System.Text;
  8. /// <summary>
  9. /// 网络同步数据基类 2022.5.27 gwang
  10. /// </summary>
  11. public abstract class Base_NetSyncData : INetSyncData, INotifyPropertyChanged
  12. {
  13. [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
  14. protected class JsonRawAttribute : Attribute
  15. {
  16. }
  17. public Base_NetSyncData() => this.PropertyChanged += (s, e) => IsChanged = true;
  18. [JsonIgnore]
  19. public virtual bool IsChanged { get; private set; }
  20. public event PropertyChangedEventHandler? PropertyChanged;
  21. protected void NotifyPropertyChanged([CallerMemberName] string propertyName = "") =>
  22. PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
  23. /// <summary>需要在actor线(协)程内部调用才安全</summary>
  24. public virtual void ClearChanges() => this.IsChanged = false;
  25. /// <summary>
  26. /// 序列化为json串
  27. /// </summary>
  28. virtual public string Json() => JsonConvert.SerializeObject(this);
  29. public override string ToString()
  30. {
  31. return this.Json();
  32. }
  33. /// <summary>
  34. /// 计算自身数据(序列化为json串后)的MD5值
  35. /// </summary>
  36. /// <param name="tolower">是否转为小写字符串,默认:false</param>
  37. virtual public string Md5(bool tolower = false)
  38. {
  39. var sb = new StringBuilder();
  40. var md5 = MD5.Create();
  41. byte[] hash = md5.ComputeHash(Encoding.UTF8.GetBytes(Json())); // 计算MD5的值
  42. hash.ToList().ForEach(i => sb.Append(tolower ? $"{i:x2}" : $"{i:X2}")); // 转为32位16进制字大写(或者小写)符串
  43. return sb.ToString();
  44. }
  45. }