using System;
using System.Collections.Generic;
using Fantasy.Assembly;
using Fantasy.Helper;
#if !FANTASY_EXPORTER
using Fantasy.Network;
#endif
#pragma warning disable CS8604 // Possible null reference argument.
#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable.
#pragma warning disable CS8625 // Cannot convert null literal to non-nullable reference type.
#pragma warning disable CS8602 // Dereference of a possibly null reference.
#pragma warning disable CS8600 // Converting null literal or possible null value to non-nullable type.
namespace Fantasy.Serialize
{
///
/// 框架内置的序列化器类型
///
public static class FantasySerializerType
{
///
/// ProtoBuf在SerializerManager的数组下标
///
public const int ProtoBuf = 0;
///
/// Bson在SerializerManager的数组下标
///
public const int Bson = 1;
}
///
/// 管理序列化静态方法,主要是优化网络协议时使用。
///
public static class SerializerManager
{
private static ISerialize[] _serializers;
private static bool _isInitialized = false;
#if FANTASY_NET || FANTASY_UNITY
///
/// 初始化方法
///
public static void Initialize()
{
if (_isInitialized)
{
return;
}
try
{
var sort = new SortedList();
foreach (var serializerType in AssemblySystem.ForEach(typeof(ISerialize)))
{
var serializer = (ISerialize)Activator.CreateInstance(serializerType);
var computeHash64 = HashCodeHelper.ComputeHash64(serializer.SerializeName);
sort.Add(computeHash64, serializer);
}
var index = 1;
_serializers = new ISerialize[sort.Count];
foreach (var (_, serialize) in sort)
{
var serializerIndex = 0;
switch (serialize)
{
case ProtoBufPackHelper:
{
serializerIndex = FantasySerializerType.ProtoBuf;
break;
}
case BsonPackHelper:
{
serializerIndex = FantasySerializerType.Bson;
break;
}
default:
{
serializerIndex = ++index;
break;
}
}
_serializers[serializerIndex] = serialize;
}
_isInitialized = true;
Log.Info($"初始化序列化器成功,数量为:{_serializers.Length}");
}
catch (Exception e)
{
Log.Error(e);
Dispose();
}
}
#else
///
/// 初始化方法
///
public static void Initialize()
{
if (_isInitialized)
{
return;
}
_serializers = new ISerialize[1];
_serializers[0] = new ProtoBufPackHelper();
}
#endif
///
/// 销毁方法
///
public static void Dispose()
{
_isInitialized = false;
Array.Clear(_serializers, 0, _serializers.Length);
}
///
/// 根据协议类型获取序列化器
///
///
///
public static ISerialize GetSerializer(uint opCodeProtocolType)
{
return _serializers[opCodeProtocolType];
}
///
/// 获得一个序列化器
///
///
///
///
public static bool TryGetSerializer(uint opCodeProtocolType, out ISerialize serializer)
{
if (opCodeProtocolType < _serializers.Length)
{
serializer = _serializers[opCodeProtocolType];
return true;
}
serializer = default;
return false;
}
}
}