Просмотр исходного кода

Mongo注册调整,有两个原因
1. 注册类型有些是在Model中,所以注册的方法需要放到Model中
2. Mongo注册的数据之前没有清理,假如不关进程重新加载model,其实需要清理,所以搞个singleton来负责这部分数据的生命周期

tanghai 2 лет назад
Родитель
Сommit
ea32badf67

+ 1 - 2
Share/Tool/Init.cs

@@ -25,8 +25,7 @@ namespace ET.Server
                 
                 World.Instance.AddSingleton<CodeTypes, Assembly[]>(new[] { typeof (Init).Assembly });
                 World.Instance.AddSingleton<EventSystem>();
-                
-                MongoHelper.Register();
+                World.Instance.AddSingleton<MongoSingleton>();
                 
                 ETTask.ExceptionHandler += Log.Error;
                 

+ 14 - 130
Unity/Assets/Scripts/Core/Serialize/MongoHelper.cs

@@ -1,134 +1,21 @@
 using System;
-using System.Collections.Generic;
 using System.ComponentModel;
 using System.IO;
-using System.Reflection;
 using MongoDB.Bson;
 using MongoDB.Bson.IO;
 using MongoDB.Bson.Serialization;
-using MongoDB.Bson.Serialization.Conventions;
-using MongoDB.Bson.Serialization.Serializers;
-using TrueSync;
-using Unity.Mathematics;
 
 namespace ET
 {
     public static class MongoHelper
     {
-        private class StructBsonSerialize<TValue>: StructSerializerBase<TValue> where TValue : struct
-        {
-            public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, TValue value)
-            {
-                Type nominalType = args.NominalType;
-
-                IBsonWriter bsonWriter = context.Writer;
-
-                bsonWriter.WriteStartDocument();
-
-                FieldInfo[] fields = nominalType.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
-                foreach (FieldInfo field in fields)
-                {
-                    bsonWriter.WriteName(field.Name);
-                    BsonSerializer.Serialize(bsonWriter, field.FieldType, field.GetValue(value));
-                }
-
-                bsonWriter.WriteEndDocument();
-            }
-
-            public override TValue Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
-            {
-                //boxing is required for SetValue to work
-                object obj = new TValue();
-                Type actualType = args.NominalType;
-                IBsonReader bsonReader = context.Reader;
-
-                bsonReader.ReadStartDocument();
-
-                while (bsonReader.State != BsonReaderState.EndOfDocument)
-                {
-                    switch (bsonReader.State)
-                    {
-                        case BsonReaderState.Name:
-                        {
-                            string name = bsonReader.ReadName(Utf8NameDecoder.Instance);
-                            FieldInfo field = actualType.GetField(name);
-                            if (field != null)
-                            {
-                                object value = BsonSerializer.Deserialize(bsonReader, field.FieldType);
-                                field.SetValue(obj, value);
-                            }
-
-                            break;
-                        }
-                        case BsonReaderState.Type:
-                        {
-                            bsonReader.ReadBsonType();
-                            break;
-                        }
-                        case BsonReaderState.Value:
-                        {
-                            bsonReader.SkipValue();
-                            break;
-                        }
-                    }
-                }
-
-                bsonReader.ReadEndDocument();
-
-                return (TValue)obj;
-            }
-        }
-
-        [StaticField]
-        private static readonly JsonWriterSettings defaultSettings = new() { OutputMode = JsonOutputMode.RelaxedExtendedJson };
-
-        public static void Register()
-        {
-            // 自动注册IgnoreExtraElements
-            ConventionPack conventionPack = new ConventionPack { new IgnoreExtraElementsConvention(true) };
-
-            ConventionRegistry.Register("IgnoreExtraElements", conventionPack, type => true);
-
-            RegisterStruct<float2>();
-            RegisterStruct<float3>();
-            RegisterStruct<float4>();
-            RegisterStruct<quaternion>();
-            
-            RegisterStruct<FP>();
-            RegisterStruct<TSVector>();
-            RegisterStruct<TSVector2>();
-            RegisterStruct<TSVector4>();
-            RegisterStruct<TSQuaternion>();
-
-            Dictionary<string, Type> types = CodeTypes.Instance.GetTypes();
-            foreach (Type type in types.Values)
-            {
-                if (!type.IsSubclassOf(typeof (Object)))
-                {
-                    continue;
-                }
-
-                if (type.IsGenericType)
-                {
-                    continue;
-                }
-
-                BsonClassMap.LookupClassMap(type);
-            }
-        }
-
-        public static void RegisterStruct<T>() where T : struct
-        {
-            BsonSerializer.RegisterSerializer(typeof (T), new StructBsonSerialize<T>());
-        }
-
         public static string ToJson(object obj)
         {
             if (obj is ISupportInitialize supportInitialize)
             {
                 supportInitialize.BeginInit();
             }
-            return obj.ToJson(defaultSettings);
+            return obj.ToJson(MongoSingleton.Instance.DefaultSettings);
         }
 
         public static string ToJson(object obj, JsonWriterSettings settings)
@@ -172,15 +59,14 @@ namespace ET
             {
                 supportInitialize.BeginInit();
             }
+
+            using BsonBinaryWriter bsonWriter = new(stream, BsonBinaryWriterSettings.Defaults);
             
-            using (BsonBinaryWriter bsonWriter = new BsonBinaryWriter(stream, BsonBinaryWriterSettings.Defaults))
-            {
-                BsonSerializationContext context = BsonSerializationContext.CreateRoot(bsonWriter);
-                BsonSerializationArgs args = default;
-                args.NominalType = typeof (object);
-                IBsonSerializer serializer = BsonSerializer.LookupSerializer(args.NominalType);
-                serializer.Serialize(context, args, message);
-            }
+            BsonSerializationContext context = BsonSerializationContext.CreateRoot(bsonWriter);
+            BsonSerializationArgs args = default;
+            args.NominalType = typeof (object);
+            IBsonSerializer serializer = BsonSerializer.LookupSerializer(args.NominalType);
+            serializer.Serialize(context, args, message);
         }
 
         public static object Deserialize(Type type, byte[] bytes)
@@ -199,10 +85,9 @@ namespace ET
         {
             try
             {
-                using (MemoryStream memoryStream = new MemoryStream(bytes, index, count))
-                {
-                    return BsonSerializer.Deserialize(memoryStream, type);
-                }
+                using MemoryStream memoryStream = new(bytes, index, count);
+                
+                return BsonSerializer.Deserialize(memoryStream, type);
             }
             catch (Exception e)
             {
@@ -226,10 +111,9 @@ namespace ET
         {
             try
             {
-                using (MemoryStream memoryStream = new MemoryStream(bytes))
-                {
-                    return (T)BsonSerializer.Deserialize(memoryStream, typeof (T));
-                }
+                using MemoryStream memoryStream = new(bytes);
+                
+                return (T)BsonSerializer.Deserialize(memoryStream, typeof (T));
             }
             catch (Exception e)
             {

+ 19 - 0
Unity/Assets/Scripts/Core/Serialize/MongoSingleton.cs

@@ -0,0 +1,19 @@
+using MongoDB.Bson.IO;
+
+namespace ET
+{
+    public class MongoSingleton: Singleton<MongoSingleton>, ISingletonAwake
+    {
+        [StaticField]
+        public readonly JsonWriterSettings DefaultSettings = new() { OutputMode = JsonOutputMode.RelaxedExtendedJson };
+        
+        public void Awake()
+        {
+        }
+
+        protected override void Destroy()
+        {
+            // 清理注册的Mongo元数据
+        }
+    }
+}

+ 11 - 0
Unity/Assets/Scripts/Core/Serialize/MongoSingleton.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 9218aea5952c98549898b8f8f305c328
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 72 - 0
Unity/Assets/Scripts/Core/Serialize/StructBsonSerialize.cs

@@ -0,0 +1,72 @@
+using System;
+using System.Reflection;
+using MongoDB.Bson.IO;
+using MongoDB.Bson.Serialization;
+using MongoDB.Bson.Serialization.Serializers;
+
+namespace ET
+{
+    public class StructBsonSerialize<TValue>: StructSerializerBase<TValue> where TValue : struct
+    {
+        public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, TValue value)
+        {
+            Type nominalType = args.NominalType;
+
+            IBsonWriter bsonWriter = context.Writer;
+
+            bsonWriter.WriteStartDocument();
+
+            FieldInfo[] fields = nominalType.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
+            foreach (FieldInfo field in fields)
+            {
+                bsonWriter.WriteName(field.Name);
+                BsonSerializer.Serialize(bsonWriter, field.FieldType, field.GetValue(value));
+            }
+
+            bsonWriter.WriteEndDocument();
+        }
+
+        public override TValue Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
+        {
+            //boxing is required for SetValue to work
+            object obj = new TValue();
+            Type actualType = args.NominalType;
+            IBsonReader bsonReader = context.Reader;
+
+            bsonReader.ReadStartDocument();
+
+            while (bsonReader.State != BsonReaderState.EndOfDocument)
+            {
+                switch (bsonReader.State)
+                {
+                    case BsonReaderState.Name:
+                    {
+                        string name = bsonReader.ReadName(Utf8NameDecoder.Instance);
+                        FieldInfo field = actualType.GetField(name);
+                        if (field != null)
+                        {
+                            object value = BsonSerializer.Deserialize(bsonReader, field.FieldType);
+                            field.SetValue(obj, value);
+                        }
+
+                        break;
+                    }
+                    case BsonReaderState.Type:
+                    {
+                        bsonReader.ReadBsonType();
+                        break;
+                    }
+                    case BsonReaderState.Value:
+                    {
+                        bsonReader.SkipValue();
+                        break;
+                    }
+                }
+            }
+
+            bsonReader.ReadEndDocument();
+
+            return (TValue)obj;
+        }
+    }
+}

+ 11 - 0
Unity/Assets/Scripts/Core/Serialize/StructBsonSerialize.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 9914f43d18f05d1469b38453a5334d63
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 4 - 3
Unity/Assets/Scripts/Model/Share/Entry.cs

@@ -29,9 +29,10 @@ namespace ET
         private static async ETTask StartAsync()
         {
             WinPeriod.Init();
-            
-            MongoHelper.RegisterStruct<LSInput>();
-            MongoHelper.Register();
+
+            World.Instance.AddSingleton<MongoSingleton>();
+            // 注册Mongo type,mongo驱动是放在static字段中,假如需要清理,可以在MongoSingleton Destroy中清理
+            MongoRegister.Register();
 
             World.Instance.AddSingleton<IdGenerater>();
             World.Instance.AddSingleton<OpcodeType>();

+ 52 - 0
Unity/Assets/Scripts/Model/Share/MongoRegister.cs

@@ -0,0 +1,52 @@
+using System;
+using System.Collections.Generic;
+using MongoDB.Bson.Serialization;
+using MongoDB.Bson.Serialization.Conventions;
+using TrueSync;
+using Unity.Mathematics;
+
+namespace ET
+{
+    public static class MongoRegister
+    {
+        private static void RegisterStruct<T>() where T : struct
+        {
+            BsonSerializer.RegisterSerializer(typeof (T), new StructBsonSerialize<T>());
+        }
+        
+        public static void Register()
+        {
+            // 自动注册IgnoreExtraElements
+            ConventionPack conventionPack = new() { new IgnoreExtraElementsConvention(true) };
+
+            ConventionRegistry.Register("IgnoreExtraElements", conventionPack, type => true);
+
+            RegisterStruct<float2>();
+            RegisterStruct<float3>();
+            RegisterStruct<float4>();
+            RegisterStruct<quaternion>();
+            RegisterStruct<FP>();
+            RegisterStruct<TSVector>();
+            RegisterStruct<TSVector2>();
+            RegisterStruct<TSVector4>();
+            RegisterStruct<TSQuaternion>();
+            RegisterStruct<LSInput>();
+
+            Dictionary<string, Type> types = CodeTypes.Instance.GetTypes();
+            foreach (Type type in types.Values)
+            {
+                if (!type.IsSubclassOf(typeof (Object)))
+                {
+                    continue;
+                }
+
+                if (type.IsGenericType)
+                {
+                    continue;
+                }
+
+                BsonClassMap.LookupClassMap(type);
+            }
+        }
+    }
+}

+ 11 - 0
Unity/Assets/Scripts/Model/Share/MongoRegister.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 617e190a5f9908446a769d3dc850e335
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: