#if UNITY using UnityEngine; #endif using System; using System.Collections.Generic; using System.IO; using System.Linq; using Microsoft.SqlServer.Server; using Newtonsoft.Json; namespace BITKit { public class BITBinary { static Dictionary netReaders = new(); static List serializableTypes = new(); [ExcuteOnStart] public static async void Start() { netReaders.Clear(); serializableTypes.Clear(); foreach (var x in await ReflectionHelper.GetInstances()) { var typeName = x.GetMessageType().FullName; netReaders.Add(typeName, x); BIT4Log.Log($"已注册类型:{typeName}"); } IEnumerable serializes = await ReflectionHelper.GetInstances(); #if UNITY serializes = serializes.Where(x => x is not UnityEngine.Object); #else #endif foreach (var x in serializes) { serializableTypes.Add(x.GetType()); BIT4Log.Log($"已注册类型:{x.GetType().FullName}"); } } public static object Read(byte[] buffer) => (T)ReadAsValue(buffer); public static object ReadAsValue(byte[] buffer) { using var ms = new MemoryStream(buffer); using var reader = new BinaryReader(ms); return Read(reader); } public static object Read(BinaryReader reader) { var typeName = reader.ReadString(); if (netReaders.TryGetValue(typeName, out var netReader)) { return netReader.ReadBinaryAsObject(reader); } // else if(BITSharp.TryGetTypeFromFullName(typeName,out var type)) // { // var instance = System.Activator.CreateInstance(type) as IBinarySerialize; // instance!.Read(reader); // return instance; // } else if (BITSharp.TryGetTypeFromFullName(typeName, out var type)) { return JsonConvert.DeserializeObject(reader.ReadString(), type); } else { throw new Exception("未找到读取该二进制的BinaryReader"); } } public static byte[] WriteAsBytes(object value) { using var ms = new MemoryStream(); using var writer = new BinaryWriter(ms); Write(writer, value); return ms.ToArray(); } public static void Write(BinaryWriter writer, object value) { var typeName = value.GetType().FullName; writer.Write(typeName!); if (netReaders.TryGetValue(typeName, out var netReader)) { netReader.WriteBinaryAsObject(writer,value); } else if( value is IBinarySerialize serialize) { serialize.Write(writer); } else { throw new Exception($"没有找到{value.GetType().Name}的Binary写入方法"); } } public static bool IsSupport(object obj) => IsSupport(obj.GetType().FullName); public static bool IsSupport(Type type) => IsSupport(type.FullName); public static bool IsSupport() => IsSupport(typeof(T).FullName); public static bool IsSupport(string typeName) { if (netReaders.ContainsKey(typeName)) { return true; } else if (serializableTypes.Any(x => x.FullName == typeName)) { return true; } return false; } public static bool TryWrite(object obj, out byte[] bytes) { bytes = null; if (IsSupport(obj)) { bytes = WriteAsBytes(obj); return true; } else { using var ms = new MemoryStream(); using var writer = new BinaryWriter(ms); try { writer.Write(obj!.GetType()!.FullName!); var json = JsonHelper.Get(obj); writer.Write(json); } catch (Exception e) { BIT4Log.Log(e); return false; } } return true; //bytes = null; //return false; } } }