BITKit/Packages/Core/Binary/BITBinary.cs

105 lines
3.4 KiB
C#
Raw Normal View History

2023-06-05 19:57:17 +08:00
using System.Collections;
using System.Collections.Generic;
#if UNITY
using UnityEngine;
#endif
using System.Data;
using System.IO;
using System;
using Cysharp.Threading.Tasks;
using Microsoft.SqlServer.Server;
using System.Linq;
namespace BITKit
{
public class BITBinary
{
static Dictionary<string, INetMessageReader> netReaders = new();
static List<Type> serializableTypes = new();
[ExcuteOnStart]
public static async void Start()
{
netReaders.Clear();
serializableTypes.Clear();
foreach (var x in await ReflectionHelper.GetInstances<INetMessageReader>())
{
var typeName = x.GetMessageType().FullName;
netReaders.Add(typeName, x);
BIT4Log.Log<BITBinary>($"已注册类型:{typeName}");
}
IEnumerable<IBinarySerialize> serializes = await ReflectionHelper.GetInstances<IBinarySerialize>();
#if UNITY
serializes = serializes.Where(x => x is not UnityEngine.Object);
#else
#endif
foreach (var x in serializes)
{
serializableTypes.Add(x.GetType());
BIT4Log.Log<BITBinary>($"已注册类型:{x.GetType().FullName}");
}
}
public static object Read<T>(byte[] buffer)
{
using var ms = new MemoryStream(buffer);
using var reader = new BinaryReader(ms);
return (T)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
{
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(string.Format("没有找到{0}而二进制写入方法", value.GetType().Name));
}
}
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 IsSupport(Type type) => IsSupport(type.FullName);
}
}