This commit is contained in:
CortexCore
2024-06-12 16:01:56 +08:00
parent 01b19130a9
commit 126131b842
8 changed files with 208 additions and 112 deletions

View File

@@ -61,51 +61,53 @@ namespace BITKit
public static object Read(BinaryReader reader)
{
try
if (reader.ReadBoolean())
{
if (reader.ReadBoolean())
var objs = new object[reader.ReadInt32()];
for (var i = 0; i < objs.Length; i++)
{
var objs = new object[reader.ReadInt32()];
for (var i = 0; i < objs.Length; i++)
{
objs[i] = Read(reader);
}
return objs.ToArray();
objs[i] = ReadInternel(reader);
}
}
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;
return objs.ToArray();
}
var json = reader.ReadString();
if (string.IsNullOrEmpty(json))
return ReadInternel(reader);
object ReadInternel(BinaryReader reader)
{
throw new Exception($"从二进制中读取的json值为空");
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))
{
throw new Exception($"从二进制中读取的json值为空");
}
try
{
if (BITSharp.TryGetTypeFromFullName(typeName, out var type))
return JsonConvert.DeserializeObject(json, type);
}
catch (Exception e)
{
BIT4Log.Warning<BITBinary>($"反序列化失败,类型:{typeName},值:\n{json}");
BIT4Log.LogException(e);
}
throw new Exception("未找到读取该二进制的BinaryReader");
}
try
{
if (BITSharp.TryGetTypeFromFullName(typeName, out var type))
return JsonConvert.DeserializeObject(json, type);
}
catch (Exception e)
{
BIT4Log.Warning<BITBinary>($"反序列化失败,类型:{typeName},值:\n{json}");
BIT4Log.LogException(e);
}
throw new Exception("未找到读取该二进制的BinaryReader");
}
public static byte[] WriteAsBytes(object value)
@@ -119,47 +121,45 @@ namespace BITKit
{
if (value is object[] objects)
{
if (objects.Length is 1)
writer.Write(true);
writer.Write(objects.Length);
foreach (var obj in objects)
{
writer.Write(false);
value = objects[0];
}
else
{
writer.Write(true);
writer.Write(objects.Length);
foreach (var obj in objects)
{
Write(writer,obj);
}
WriteInterel(writer, obj);
}
}
else
{
writer.Write(false);
WriteInterel(writer,value);
}
var typeName = value.GetType().FullName;
writer.Write(typeName!);
if (netReaders.TryGetValue(typeName, out var netReader))
return;
void WriteInterel(BinaryWriter writer, object value)
{
netReader.WriteBinaryAsObject(writer,value);
}
else if (value is IBinarySerialize serialize)
{
serialize.Write(writer);
}
else
{
try
var typeName = value.GetType().FullName;
writer.Write(typeName!);
if (netReaders.TryGetValue(typeName, out var netReader))
{
writer.Write(JsonConvert.SerializeObject(value));
netReader.WriteBinaryAsObject(writer,value);
}
catch (Exception e)
else if (value is IBinarySerialize serialize)
{
BIT4Log.Warning<BITBinary>(typeName);
throw;
serialize.Write(writer);
}
else
{
try
{
writer.Write(JsonConvert.SerializeObject(value));
}
catch (Exception e)
{
BIT4Log.Warning<BITBinary>(typeName);
throw;
}
}
}
}
public static bool IsSupport(object obj) => IsSupport(obj.GetType().FullName);