This commit is contained in:
CortexCore
2024-06-20 10:04:18 +08:00
parent d3fd104900
commit a0d95098b8
7 changed files with 251 additions and 189 deletions

View File

@@ -3,6 +3,7 @@
using UnityEngine;
#endif
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
@@ -61,15 +62,22 @@ namespace BITKit
public static object Read(BinaryReader reader)
{
// 检测是否为数组
if (reader.ReadBoolean())
{
var objs = new object[reader.ReadInt32()];
for (var i = 0; i < objs.Length; i++)
//读取数组类型的名称
var arrayTypeName = reader.ReadString();
//获取数组类型
var arrayType = BITSharp.GetTypeFromFullName(arrayTypeName);
//创建数组实例
var array = Array.CreateInstance(arrayType, reader.ReadInt32());
//循环Reader
for (var i = 0; i < array.Length; i++)
{
objs[i] = ReadInternel(reader);
//设置值
array.SetValue(ReadInternel(reader),i);
}
return objs.ToArray();
return array;
}
return ReadInternel(reader);
@@ -82,7 +90,18 @@ namespace BITKit
if (netReaders.TryGetValue(typeName, out var netReader))
return netReader.ReadBinaryAsObject(reader);
var instance = System.Activator.CreateInstance(BITSharp.GetTypeFromFullName(typeName));
var type = BITSharp.GetTypeFromFullName(typeName);
object instance = null;
if (type.IsArray)
{
instance = Array.CreateInstance(type.GetElementType()!, reader.ReadInt32());
}
else
{
instance = System.Activator.CreateInstance(type);
}
if (instance is IBinarySerialize serialize)
{
serialize.Read(reader);
@@ -97,7 +116,7 @@ namespace BITKit
try
{
if (BITSharp.TryGetTypeFromFullName(typeName, out var type))
if (BITSharp.TryGetTypeFromFullName(typeName, out type))
return JsonConvert.DeserializeObject(json, type);
}
catch (Exception e)
@@ -119,11 +138,13 @@ namespace BITKit
}
public static void Write(BinaryWriter writer, object value)
{
if (value is object[] objects)
if (value is IEnumerable enumerable)
{
var pars = enumerable.Cast<object>().ToArray();
writer.Write(true);
writer.Write(objects.Length);
foreach (var obj in objects)
writer.Write(value.GetType().GetElementType()!.FullName!);
writer.Write(pars.Count());
foreach (var obj in pars)
{
WriteInterel(writer, obj);
}