86 lines
2.4 KiB
C#
86 lines
2.4 KiB
C#
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<int, IEntityBinaryComponent> ComponentDictionary { get; } =
|
|
new Dictionary<int, IEntityBinaryComponent>();
|
|
|
|
public override void OnStart()
|
|
{
|
|
base.OnStart();
|
|
foreach (var component in Entity.Components.OfType<IEntityBinaryComponent>())
|
|
{
|
|
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<EntityBinaryHeader>("源数据长度:"+reader.BaseStream.Length);
|
|
//读取组件数量
|
|
//读取组件ID
|
|
//读取组件数据
|
|
var count = reader.ReadInt32();
|
|
//BIT4Log.Log<EntityBinaryHeader>($"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<EntityBinaryHeader>($"id:{id},length:{length},bytes:\n{JsonHelper.Get(bytes)}");
|
|
ComponentDictionary[id].Deserialize(binaryReader);
|
|
traffic.y += length;
|
|
}
|
|
downTraffic = NetUtils.GetFileSize((long)traffic.y);
|
|
}
|
|
}
|
|
}
|