This commit is contained in:
CortexCore
2024-03-31 23:31:00 +08:00
parent e179d2eb53
commit b7b89ee71a
641 changed files with 31286 additions and 22134 deletions

View File

@@ -6,7 +6,9 @@ using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using Cysharp.Threading.Tasks;
using Microsoft.SqlServer.Server;
#if NET5_0_OR_GREATER
using Microsoft.SqlServer.Server;
#endif
@@ -17,9 +19,7 @@ namespace BITKit
public class BITBinary
{
private static readonly Dictionary<string, INetMessageReader> netReaders = new();
#if NET5_0_OR_GREATER
public static readonly List<Type> serializableTypes = new();
#endif
public static async UniTask Start()
{
@@ -27,30 +27,31 @@ namespace BITKit
#if NET5_0_OR_GREATER
serializableTypes.Clear();
#endif
var stringBuilder = new StringBuilder();
foreach (var x in await ReflectionHelper.GetInstances<INetMessageReader>())
{
var typeName = x.GetMessageType().FullName;
if (typeName == null) continue;
netReaders.Add(typeName, x);
BIT4Log.Log<BITBinary>($"已注册类型:{typeName}");
stringBuilder.AppendLine(typeName);
}
// #if NET5_0_OR_GREATER
// var serializes = await ReflectionHelper.GetInstances<IBinarySerialize>();
// #else
//
// #endif
// #if NET5_0_OR_GREATER
// #else
// serializes = serializes.Where(x => x is not UnityEngine.Object);
// #endif
// foreach (var x in serializes)
// {
// serializableTypes.Add(x.GetType());
// BIT4Log.Log<BITBinary>($"已注册类型:{x.GetType().FullName}");
// }
var serializes = await ReflectionHelper.GetInstances<IBinarySerialize>();
#if NET5_0_OR_GREATER
#else
serializes = serializes.Where(x => x.GetType().IsAssignableFrom(typeof(UnityEngine.Object)) is false);
#endif
foreach (var x in serializes)
{
serializableTypes.Add(x.GetType());
//BIT4Log.Log<BITBinary>($"已注册类型:{x.GetType().FullName}");
stringBuilder.AppendLine(x.GetType().FullName);
}
BIT4Log.Log<BITBinary>($"已注册类型:\n{stringBuilder}");
}
public static object Read<T>(byte[] buffer) => (T)ReadAsValue(buffer);
public static T Read<T>(byte[] buffer) => (T)ReadAsValue(buffer);
public static object ReadAsValue(byte[] buffer)
{
using var ms = new MemoryStream(buffer);
@@ -60,20 +61,35 @@ namespace BITKit
public static object Read(BinaryReader reader)
{
var isObjects = reader.ReadBoolean();
if (isObjects)
try
{
var objs = new object[reader.ReadInt32()];
for (var i = 0; i < objs.Length; i++)
if (reader.ReadBoolean())
{
objs[i] = Read(reader);
var objs = new object[reader.ReadInt32()];
for (var i = 0; i < objs.Length; i++)
{
objs[i] = Read(reader);
}
return objs.ToArray();
}
return objs.ToArray();
}
catch (Exception)
{
}
var typeName = reader.ReadString();
if (netReaders.TryGetValue(typeName, out var netReader))
return netReader.ReadBinaryAsObject(reader);
var instance = System.Activator.CreateInstance(BITSharp.GetTypeFromFullName(typeName));
if (instance is IBinarySerialize serialize)
{
serialize.Read(reader);
return instance;
}
var json = reader.ReadString();
if (string.IsNullOrEmpty(json))
{
@@ -128,9 +144,22 @@ namespace BITKit
{
netReader.WriteBinaryAsObject(writer,value);
}
else if (value is IBinarySerialize serialize)
{
serialize.Write(writer);
}
else
{
writer.Write(JsonConvert.SerializeObject(value));
try
{
writer.Write(JsonConvert.SerializeObject(value));
}
catch (Exception e)
{
BIT4Log.Warning<BITBinary>(typeName);
throw;
}
}
}
public static bool IsSupport(object obj) => IsSupport(obj.GetType().FullName);
@@ -138,21 +167,9 @@ namespace BITKit
public static bool IsSupport<T>() => IsSupport(typeof(T).FullName);
public static bool IsSupport(string typeName)
{
if (netReaders.ContainsKey(typeName))
{
return true;
}
#if NET5_0_OR_GREATER
else if (serializableTypes.Any(x => x.FullName == typeName))
{
return true;
}
#endif
return false;
return netReaders.ContainsKey(typeName) || serializableTypes.Any(x => x.FullName == typeName);
}
public static bool TryWrite(object obj, out byte[] bytes)
{
bytes = null;