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();
}
}