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; } } }