using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; using UnityEngine; namespace BITKit.Entities { [CustomType(typeof(IEntityBinaryHeader))] public class EntityBinaryHeader : EntityBehavior,IEntityBinaryHeader { [Header(Constant.Header.Debug)] [SerializeField] [ReadOnly]private Vector2 traffic; [SerializeField] [ReadOnly]private string upTraffic; [SerializeField] [ReadOnly]private string downTraffic; public int Id => (int)Entity.Id; public IDictionary ComponentDictionary { get; } = new Dictionary(); public override void OnStart() { base.OnStart(); foreach (var component in Entity.Components.OfType()) { ComponentDictionary.Add(component.Id, component); } } public void Serialize(BinaryWriter writer) { //写入组件数量 //写入组件ID //写入组件数据 //写入组件数据长度 var length = ComponentDictionary.Count; writer.Write(length); foreach (var component in ComponentDictionary.Values) { writer.Write(component.Id); } foreach (var component in ComponentDictionary.Values) { using var ms = new MemoryStream(); using var binaryWriter = new BinaryWriter(ms); component.Serialize(binaryWriter); binaryWriter.Flush(); ms.Flush(); var bytes = ms.ToArray(); writer.Write(bytes.Length); writer.Write(bytes); traffic.x += bytes.Length; } upTraffic = NetUtils.GetFileSize((long)traffic.x); } public void Deserialize(BinaryReader reader) { //BIT4Log.Log("源数据长度:"+reader.BaseStream.Length); //读取组件数量 //读取组件ID //读取组件数据 var count = reader.ReadInt32(); //BIT4Log.Log($"count:{count}"); var ids = new int[count]; for (var i = 0; i < count; i++) { ids[i] = reader.ReadInt32(); } foreach (var id in ids) { var length = reader.ReadInt32(); var bytes = reader.ReadBytes(length); using var stream = new MemoryStream(bytes); using var binaryReader = new BinaryReader(stream); //BIT4Log.Log($"id:{id},length:{length},bytes:\n{JsonHelper.Get(bytes)}"); ComponentDictionary[id].Deserialize(binaryReader); traffic.y += length; } downTraffic = NetUtils.GetFileSize((long)traffic.y); } } }