Forráskód Böngészése

Bson序列化ChildrenCollection跟ComponentsCollection 忽略key实现

tanghai 1 éve
szülő
commit
00c75de663

+ 2 - 4
Unity/Assets/Scripts/Core/Entity/Entity.cs

@@ -383,9 +383,8 @@ namespace ET
         }
 
         [MemoryPackInclude]
-        [BsonIgnore]
+        [BsonElement]
         [BsonIgnoreIfNull]
-        [BsonDictionaryOptions(DictionaryRepresentation.ArrayOfArrays)]
         protected ChildrenCollection children;
 
         [MemoryPackIgnore]
@@ -420,9 +419,8 @@ namespace ET
         }
 
         [MemoryPackInclude]
-        [BsonIgnore]
+        [BsonElement]
         [BsonIgnoreIfNull]
-        [BsonDictionaryOptions(DictionaryRepresentation.ArrayOfArrays)]
         protected ComponentsCollection components;
 
         [MemoryPackIgnore]

+ 44 - 0
Unity/Assets/Scripts/Core/Serialize/BsonChildrenCollectionSerializer.cs

@@ -0,0 +1,44 @@
+using MongoDB.Bson;
+using MongoDB.Bson.Serialization;
+
+namespace ET
+{
+    public class BsonChildrenCollectionSerializer: IBsonSerializer
+    {
+        public object Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
+        {
+            ChildrenCollection childrenCollection = new ChildrenCollection();
+            IBsonSerializer<Entity> bsonSerializer = BsonSerializer.LookupSerializer<Entity>();
+            var bsonReader = context.Reader;
+            bsonReader.ReadStartArray();
+            while (bsonReader.ReadBsonType() != BsonType.EndOfDocument)
+            {
+                Entity entity = bsonSerializer.Deserialize(context);
+                childrenCollection.Add(entity.Id, entity);
+            }
+            bsonReader.ReadEndArray();
+
+            return childrenCollection;
+        }
+
+        public void Serialize(BsonSerializationContext context, BsonSerializationArgs args, object value)
+        {
+            var bsonWriter = context.Writer;
+            bsonWriter.WriteStartArray();
+            ChildrenCollection childrenCollection = (ChildrenCollection)value;
+
+            IBsonSerializer<Entity> bsonSerializer = BsonSerializer.LookupSerializer<Entity>();
+            foreach ((long _, Entity entity) in childrenCollection)
+            {
+                if (entity is not ISerializeToEntity)
+                {
+                    continue;
+                }
+                bsonSerializer.Serialize(context, entity);
+            }
+            bsonWriter.WriteEndArray();
+        }
+
+        public System.Type ValueType { get; }
+    }
+}

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

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

+ 45 - 0
Unity/Assets/Scripts/Core/Serialize/BsonComponentsCollectionSerializer.cs

@@ -0,0 +1,45 @@
+using MongoDB.Bson;
+using MongoDB.Bson.IO;
+using MongoDB.Bson.Serialization;
+
+namespace ET
+{
+    public class BsonComponentsCollectionSerializer: IBsonSerializer
+    {
+        public object Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
+        {
+            ComponentsCollection componentsCollection = new();
+            IBsonSerializer<Entity> bsonSerializer = BsonSerializer.LookupSerializer<Entity>();
+            IBsonReader bsonReader = context.Reader;
+            bsonReader.ReadStartArray();
+            while (bsonReader.ReadBsonType() != BsonType.EndOfDocument)
+            {
+                Entity entity = bsonSerializer.Deserialize(context);
+                componentsCollection.Add(Entity.GetLongHashCodeByType(entity.GetType()), entity);
+            }
+            bsonReader.ReadEndArray();
+
+            return componentsCollection;
+        }
+
+        public void Serialize(BsonSerializationContext context, BsonSerializationArgs args, object value)
+        {
+            IBsonWriter bsonWriter = context.Writer;
+            bsonWriter.WriteStartArray();
+            ComponentsCollection componentsCollection = (ComponentsCollection)value;
+
+            IBsonSerializer<Entity> bsonSerializer = BsonSerializer.LookupSerializer<Entity>();
+            foreach ((long _, Entity entity) in componentsCollection)
+            {
+                if (entity is not ISerializeToEntity)
+                {
+                    continue;
+                }
+                bsonSerializer.Serialize(context, entity);
+            }
+            bsonWriter.WriteEndArray();
+        }
+
+        public System.Type ValueType { get; }
+    }
+}

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

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

+ 0 - 294
Unity/Assets/Scripts/Core/Serialize/BsonSortedDictionaryInterfaceImplementerSerializer.cs

@@ -1,294 +0,0 @@
-/* Copyright 2010-present MongoDB Inc.
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-using System;
-using System.Collections;
-using System.Collections.Generic;
-using System.Collections.ObjectModel;
-using MongoDB.Bson.Serialization;
-using MongoDB.Bson.Serialization.Options;
-using MongoDB.Bson.Serialization.Serializers;
-
-namespace ET
-{
-    /// <summary>
-    /// Represents a serializer for a class that implements IDictionary.
-    /// </summary>
-    /// <typeparam name="TDictionary">The type of the dictionary.</typeparam>
-    public class BsonSortedDictionaryInterfaceImplementerSerializer<TDictionary> :
-        BsonSortedDictionarySerializerBase<TDictionary>,
-        IChildSerializerConfigurable,
-        IDictionaryRepresentationConfigurable
-            where TDictionary : class, IDictionary, new()
-    {
-        /// <summary>
-        /// Initializes a new instance of the <see cref="DictionaryInterfaceImplementerSerializer{TDictionary}"/> class.
-        /// </summary>
-        public BsonSortedDictionaryInterfaceImplementerSerializer()
-        {
-        }
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="DictionaryInterfaceImplementerSerializer{TDictionary}"/> class.
-        /// </summary>
-        /// <param name="dictionaryRepresentation">The dictionary representation.</param>
-        public BsonSortedDictionaryInterfaceImplementerSerializer(DictionaryRepresentation dictionaryRepresentation)
-            : base(dictionaryRepresentation)
-        {
-        }
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="DictionaryInterfaceImplementerSerializer{TDictionary}"/> class.
-        /// </summary>
-        /// <param name="dictionaryRepresentation">The dictionary representation.</param>
-        /// <param name="keySerializer">The key serializer.</param>
-        /// <param name="valueSerializer">The value serializer.</param>
-        public BsonSortedDictionaryInterfaceImplementerSerializer(DictionaryRepresentation dictionaryRepresentation, IBsonSerializer keySerializer, IBsonSerializer valueSerializer)
-            : base(dictionaryRepresentation, keySerializer, valueSerializer)
-        {
-        }
-
-        // public methods
-        /// <summary>
-        /// Returns a serializer that has been reconfigured with the specified dictionary representation.
-        /// </summary>
-        /// <param name="dictionaryRepresentation">The dictionary representation.</param>
-        /// <returns>The reconfigured serializer.</returns>
-        public BsonSortedDictionaryInterfaceImplementerSerializer<TDictionary> WithDictionaryRepresentation(DictionaryRepresentation dictionaryRepresentation)
-        {
-            if (dictionaryRepresentation == DictionaryRepresentation)
-            {
-                return this;
-            }
-            else
-            {
-                return new BsonSortedDictionaryInterfaceImplementerSerializer<TDictionary>(dictionaryRepresentation, KeySerializer, ValueSerializer);
-            }
-        }
-
-        /// <summary>
-        /// Returns a serializer that has been reconfigured with the specified dictionary representation and key value serializers.
-        /// </summary>
-        /// <param name="dictionaryRepresentation">The dictionary representation.</param>
-        /// <param name="keySerializer">The key serializer.</param>
-        /// <param name="valueSerializer">The value serializer.</param>
-        /// <returns>The reconfigured serializer.</returns>
-        public BsonSortedDictionaryInterfaceImplementerSerializer<TDictionary> WithDictionaryRepresentation(DictionaryRepresentation dictionaryRepresentation, IBsonSerializer keySerializer, IBsonSerializer valueSerializer)
-        {
-            if (dictionaryRepresentation == DictionaryRepresentation && keySerializer == KeySerializer && valueSerializer == ValueSerializer)
-            {
-                return this;
-            }
-            else
-            {
-                return new BsonSortedDictionaryInterfaceImplementerSerializer<TDictionary>(dictionaryRepresentation, keySerializer, valueSerializer);
-            }
-        }
-
-        /// <summary>
-        /// Returns a serializer that has been reconfigured with the specified key serializer.
-        /// </summary>
-        /// <param name="keySerializer">The key serializer.</param>
-        /// <returns>The reconfigured serializer.</returns>
-        public BsonSortedDictionaryInterfaceImplementerSerializer<TDictionary> WithKeySerializer(IBsonSerializer keySerializer)
-        {
-            if (keySerializer == KeySerializer)
-            {
-                return this;
-            }
-            else
-            {
-                return new BsonSortedDictionaryInterfaceImplementerSerializer<TDictionary>(DictionaryRepresentation, keySerializer, ValueSerializer);
-            }
-        }
-
-        /// <summary>
-        /// Returns a serializer that has been reconfigured with the specified value serializer.
-        /// </summary>
-        /// <param name="valueSerializer">The value serializer.</param>
-        /// <returns>The reconfigured serializer.</returns>
-        public BsonSortedDictionaryInterfaceImplementerSerializer<TDictionary> WithValueSerializer(IBsonSerializer valueSerializer)
-        {
-            if (valueSerializer == ValueSerializer)
-            {
-                return this;
-            }
-            else
-            {
-                return new BsonSortedDictionaryInterfaceImplementerSerializer<TDictionary>(DictionaryRepresentation, KeySerializer, valueSerializer);
-            }
-        }
-
-        // protected methods
-        /// <summary>
-        /// Creates the instance.
-        /// </summary>
-        /// <returns>The instance.</returns>
-        protected override TDictionary CreateInstance()
-        {
-            return new TDictionary();
-        }
-
-        // explicit interface implementations
-        IBsonSerializer IChildSerializerConfigurable.ChildSerializer
-        {
-            get { return ValueSerializer; }
-        }
-
-        IBsonSerializer IChildSerializerConfigurable.WithChildSerializer(IBsonSerializer childSerializer)
-        {
-            return WithValueSerializer(childSerializer);
-        }
-
-        IBsonSerializer IDictionaryRepresentationConfigurable.WithDictionaryRepresentation(DictionaryRepresentation dictionaryRepresentation)
-        {
-            return WithDictionaryRepresentation(dictionaryRepresentation);
-        }
-    }
-
-    /// <summary>
-    /// Represents a serializer for a class that implements <see cref="IDictionary{TKey, TValue}"/>.
-    /// </summary>
-    /// <typeparam name="TDictionary">The type of the dictionary.</typeparam>
-    /// <typeparam name="TKey">The type of the key.</typeparam>
-    /// <typeparam name="TValue">The type of the value.</typeparam>
-    public class BsonSortedDictionaryInterfaceImplementerSerializer<TDictionary, TKey, TValue> :
-        SortedDictionarySerializerBase<TDictionary, TKey, TValue>,
-        IChildSerializerConfigurable,
-        IDictionaryRepresentationConfigurable<BsonSortedDictionaryInterfaceImplementerSerializer<TDictionary, TKey, TValue>>
-            where TDictionary : class, IDictionary<TKey, TValue>
-    {
-        /// <summary>
-        /// Initializes a new instance of the <see cref="DictionaryInterfaceImplementerSerializer{TDictionary, TKey, TValue}"/> class.
-        /// </summary>
-        public BsonSortedDictionaryInterfaceImplementerSerializer()
-        {
-        }
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="DictionaryInterfaceImplementerSerializer{TDictionary, TKey, TValue}"/> class.
-        /// </summary>
-        /// <param name="dictionaryRepresentation">The dictionary representation.</param>
-        public BsonSortedDictionaryInterfaceImplementerSerializer(DictionaryRepresentation dictionaryRepresentation)
-            : base(dictionaryRepresentation)
-        {
-        }
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="DictionaryInterfaceImplementerSerializer{TDictionary, TKey, TValue}"/> class.
-        /// </summary>
-        /// <param name="dictionaryRepresentation">The dictionary representation.</param>
-        /// <param name="keySerializer">The key serializer.</param>
-        /// <param name="valueSerializer">The value serializer.</param>
-        public BsonSortedDictionaryInterfaceImplementerSerializer(DictionaryRepresentation dictionaryRepresentation, IBsonSerializer<TKey> keySerializer, IBsonSerializer<TValue> valueSerializer)
-            : base(dictionaryRepresentation, keySerializer, valueSerializer)
-        {
-        }
-
-        // public methods
-        /// <summary>
-        /// Returns a serializer that has been reconfigured with the specified dictionary representation.
-        /// </summary>
-        /// <param name="dictionaryRepresentation">The dictionary representation.</param>
-        /// <returns>The reconfigured serializer.</returns>
-        public BsonSortedDictionaryInterfaceImplementerSerializer<TDictionary, TKey, TValue> WithDictionaryRepresentation(DictionaryRepresentation dictionaryRepresentation)
-        {
-            if (dictionaryRepresentation == DictionaryRepresentation)
-            {
-                return this;
-            }
-            else
-            {
-                return new BsonSortedDictionaryInterfaceImplementerSerializer<TDictionary, TKey, TValue>(dictionaryRepresentation, KeySerializer, ValueSerializer);
-            }
-        }
-
-        /// <summary>
-        /// Returns a serializer that has been reconfigured with the specified dictionary representation and key value serializers.
-        /// </summary>
-        /// <param name="dictionaryRepresentation">The dictionary representation.</param>
-        /// <param name="keySerializer">The key serializer.</param>
-        /// <param name="valueSerializer">The value serializer.</param>
-        /// <returns>The reconfigured serializer.</returns>
-        public BsonSortedDictionaryInterfaceImplementerSerializer<TDictionary, TKey, TValue> WithDictionaryRepresentation(DictionaryRepresentation dictionaryRepresentation, IBsonSerializer<TKey> keySerializer, IBsonSerializer<TValue> valueSerializer)
-        {
-            if (dictionaryRepresentation == DictionaryRepresentation && keySerializer == KeySerializer && valueSerializer == ValueSerializer)
-            {
-                return this;
-            }
-            else
-            {
-                return new BsonSortedDictionaryInterfaceImplementerSerializer<TDictionary, TKey, TValue>(dictionaryRepresentation, keySerializer, valueSerializer);
-            }
-        }
-
-        /// <summary>
-        /// Returns a serializer that has been reconfigured with the specified key serializer.
-        /// </summary>
-        /// <param name="keySerializer">The key serializer.</param>
-        /// <returns>The reconfigured serializer.</returns>
-        public BsonSortedDictionaryInterfaceImplementerSerializer<TDictionary, TKey, TValue> WithKeySerializer(IBsonSerializer<TKey> keySerializer)
-        {
-            if (keySerializer == KeySerializer)
-            {
-                return this;
-            }
-            else
-            {
-                return new BsonSortedDictionaryInterfaceImplementerSerializer<TDictionary, TKey, TValue>(DictionaryRepresentation, keySerializer, ValueSerializer);
-            }
-        }
-
-        /// <summary>
-        /// Returns a serializer that has been reconfigured with the specified value serializer.
-        /// </summary>
-        /// <param name="valueSerializer">The value serializer.</param>
-        /// <returns>The reconfigured serializer.</returns>
-        public BsonSortedDictionaryInterfaceImplementerSerializer<TDictionary, TKey, TValue> WithValueSerializer(IBsonSerializer<TValue> valueSerializer)
-        {
-            if (valueSerializer == ValueSerializer)
-            {
-                return this;
-            }
-            else
-            {
-                return new BsonSortedDictionaryInterfaceImplementerSerializer<TDictionary, TKey, TValue>(DictionaryRepresentation, KeySerializer, valueSerializer);
-            }
-        }
-
-        // explicit interface implementations
-        IBsonSerializer IChildSerializerConfigurable.ChildSerializer
-        {
-            get { return ValueSerializer; }
-        }
-
-        IBsonSerializer IChildSerializerConfigurable.WithChildSerializer(IBsonSerializer childSerializer)
-        {
-            return WithValueSerializer((IBsonSerializer<TValue>)childSerializer);
-        }
-
-        IBsonSerializer IDictionaryRepresentationConfigurable.WithDictionaryRepresentation(DictionaryRepresentation dictionaryRepresentation)
-        {
-            return WithDictionaryRepresentation(dictionaryRepresentation);
-        }
-
-        /// <inheritdoc/>
-        protected override ICollection<KeyValuePair<TKey, TValue>> CreateAccumulator()
-        {
-            return Activator.CreateInstance<TDictionary>();
-        }
-
-    }
-}

+ 0 - 770
Unity/Assets/Scripts/Core/Serialize/BsonSortedDictionarySerializerBase.cs

@@ -1,770 +0,0 @@
-/* Copyright 2010-present MongoDB Inc.
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-using System;
-using System.Collections;
-using System.Collections.Generic;
-using MongoDB.Bson;
-using MongoDB.Bson.IO;
-using MongoDB.Bson.Serialization;
-using MongoDB.Bson.Serialization.Options;
-using MongoDB.Bson.Serialization.Serializers;
-
-namespace ET
-{
-    /// <summary>
-    /// Represents a serializer for dictionaries.
-    /// </summary>
-    /// <typeparam name="TDictionary">The type of the dictionary.</typeparam>
-    public abstract class BsonSortedDictionarySerializerBase<TDictionary> :
-        ClassSerializerBase<TDictionary>,
-        IBsonDocumentSerializer,
-        IBsonDictionarySerializer
-        where TDictionary : class, IDictionary
-    {
-        // private constants
-        private static class Flags
-        {
-            public const long Key = 1;
-            public const long Value = 2;
-        }
-
-        // private fields
-        private readonly DictionaryRepresentation _dictionaryRepresentation;
-        private readonly SerializerHelper _helper;
-        private readonly IBsonSerializer _keySerializer;
-        private readonly IBsonSerializer _valueSerializer;
-
-        // constructors
-        /// <summary>
-        /// Initializes a new instance of the <see cref="DictionarySerializerBase{TDictionary}"/> class.
-        /// </summary>
-        public BsonSortedDictionarySerializerBase()
-            : this(DictionaryRepresentation.Document)
-        {
-        }
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="DictionarySerializerBase{TDictionary}"/> class.
-        /// </summary>
-        /// <param name="dictionaryRepresentation">The dictionary representation.</param>
-        public BsonSortedDictionarySerializerBase(DictionaryRepresentation dictionaryRepresentation)
-            : this(dictionaryRepresentation, BsonSerializer.LookupSerializer<object>(), BsonSerializer.LookupSerializer<object>())
-        {
-        }
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="DictionarySerializerBase{TDictionary}"/> class.
-        /// </summary>
-        /// <param name="dictionaryRepresentation">The dictionary representation.</param>
-        /// <param name="keySerializer">The key serializer.</param>
-        /// <param name="valueSerializer">The value serializer.</param>
-        public BsonSortedDictionarySerializerBase(DictionaryRepresentation dictionaryRepresentation, IBsonSerializer keySerializer, IBsonSerializer valueSerializer)
-        {
-            _dictionaryRepresentation = dictionaryRepresentation;
-            _keySerializer = keySerializer;
-            _valueSerializer = valueSerializer;
-
-            _helper = new SerializerHelper
-            (
-                new SerializerHelper.Member("k", Flags.Key),
-                new SerializerHelper.Member("v", Flags.Value)
-            );
-        }
-
-        // public properties
-        /// <summary>
-        /// Gets the dictionary representation.
-        /// </summary>
-        /// <value>
-        /// The dictionary representation.
-        /// </value>
-        public DictionaryRepresentation DictionaryRepresentation
-        {
-            get { return _dictionaryRepresentation; }
-        }
-
-        /// <summary>
-        /// Gets the key serializer.
-        /// </summary>
-        /// <value>
-        /// The key serializer.
-        /// </value>
-        public IBsonSerializer KeySerializer
-        {
-            get { return _keySerializer; }
-        }
-
-        /// <summary>
-        /// Gets the value serializer.
-        /// </summary>
-        /// <value>
-        /// The value serializer.
-        /// </value>
-        public IBsonSerializer ValueSerializer
-        {
-            get { return _valueSerializer; }
-        }
-
-        // public methods
-        /// <inheritdoc/>
-        public bool TryGetMemberSerializationInfo(string memberName, out BsonSerializationInfo serializationInfo)
-        {
-            if (_dictionaryRepresentation != DictionaryRepresentation.Document)
-            {
-                serializationInfo = null;
-                return false;
-            }
-
-            serializationInfo = new BsonSerializationInfo(
-                memberName,
-                _valueSerializer,
-                _valueSerializer.ValueType);
-            return true;
-        }
-
-        // protected methods
-        /// <summary>
-        /// Deserializes a value.
-        /// </summary>
-        /// <param name="context">The deserialization context.</param>
-        /// <param name="args">The deserialization args.</param>
-        /// <returns>A deserialized value.</returns>
-        protected override TDictionary DeserializeValue(BsonDeserializationContext context, BsonDeserializationArgs args)
-        {
-            var bsonReader = context.Reader;
-            var bsonType = bsonReader.GetCurrentBsonType();
-            switch (bsonType)
-            {
-                case BsonType.Array:
-                    return DeserializeArrayRepresentation(context);
-                case BsonType.Document:
-                    return DeserializeDocumentRepresentation(context);
-                default:
-                    throw CreateCannotDeserializeFromBsonTypeException(bsonType);
-            }
-        }
-
-        /// <summary>
-        /// Serializes a value.
-        /// </summary>
-        /// <param name="context">The serialization context.</param>
-        /// <param name="args">The serialization args.</param>
-        /// <param name="value">The object.</param>
-        protected override void SerializeValue(BsonSerializationContext context, BsonSerializationArgs args, TDictionary value)
-        {
-            var bsonWriter = context.Writer;
-
-            switch (_dictionaryRepresentation)
-            {
-                case DictionaryRepresentation.Document:
-                    SerializeDocumentRepresentation(context, value);
-                    break;
-
-                case DictionaryRepresentation.ArrayOfArrays:
-                    SerializeArrayOfArraysRepresentation(context, value);
-                    break;
-
-                case DictionaryRepresentation.ArrayOfDocuments:
-                    SerializeArrayOfDocumentsRepresentation(context, value);
-                    break;
-
-                default:
-                    var message = string.Format("'{0}' is not a valid IDictionary representation.", _dictionaryRepresentation);
-                    throw new BsonSerializationException(message);
-            }
-        }
-
-        // protected methods
-        /// <summary>
-        /// Creates the instance.
-        /// </summary>
-        /// <returns>The instance.</returns>
-        protected abstract TDictionary CreateInstance();
-
-        // private methods
-        private TDictionary DeserializeArrayRepresentation(BsonDeserializationContext context)
-        {
-            var dictionary = CreateInstance();
-
-            var bsonReader = context.Reader;
-            bsonReader.ReadStartArray();
-            while (bsonReader.ReadBsonType() != BsonType.EndOfDocument)
-            {
-                object key;
-                object value;
-
-                var bsonType = bsonReader.GetCurrentBsonType();
-                switch (bsonType)
-                {
-                    case BsonType.Array:
-                        bsonReader.ReadStartArray();
-                        key = _keySerializer.Deserialize(context);
-                        value = _valueSerializer.Deserialize(context);
-                        bsonReader.ReadEndArray();
-                        break;
-
-                    case BsonType.Document:
-                        key = null;
-                        value = null;
-                        _helper.DeserializeMembers(context, (elementName, flag) =>
-                        {
-                            switch (flag)
-                            {
-                                case Flags.Key: key = _keySerializer.Deserialize(context); break;
-                                case Flags.Value: value = _valueSerializer.Deserialize(context); break;
-                            }
-                        });
-                        break;
-
-                    default:
-                        throw CreateCannotDeserializeFromBsonTypeException(bsonType);
-                }
-
-                dictionary.Add(key, value);
-            }
-            bsonReader.ReadEndArray();
-
-            return dictionary;
-        }
-
-        private TDictionary DeserializeDocumentRepresentation(BsonDeserializationContext context)
-        {
-            var dictionary = CreateInstance();
-            var bsonReader = context.Reader;
-            bsonReader.ReadStartDocument();
-            while (bsonReader.ReadBsonType() != BsonType.EndOfDocument)
-            {
-                var key = DeserializeKeyString(bsonReader.ReadName());
-                var value = _valueSerializer.Deserialize(context);
-                dictionary.Add(key, value);
-            }
-            bsonReader.ReadEndDocument();
-            return dictionary;
-        }
-
-        private object DeserializeKeyString(string keyString)
-        {
-            var keyDocument = new BsonDocument("k", keyString);
-            using (var keyReader = new BsonDocumentReader(keyDocument))
-            {
-                var context = BsonDeserializationContext.CreateRoot(keyReader);
-                keyReader.ReadStartDocument();
-                keyReader.ReadName("k");
-                var key = _keySerializer.Deserialize(context);
-                keyReader.ReadEndDocument();
-                return key;
-            }
-        }
-
-        private void SerializeArrayOfArraysRepresentation(BsonSerializationContext context, TDictionary value)
-        {
-            var bsonWriter = context.Writer;
-            bsonWriter.WriteStartArray();
-            foreach (DictionaryEntry dictionaryEntry in value)
-            {
-                if (dictionaryEntry.Value is not ISerializeToEntity)
-                {
-                    continue;
-                }
-                bsonWriter.WriteStartArray();
-                _keySerializer.Serialize(context, dictionaryEntry.Key);
-                _valueSerializer.Serialize(context, dictionaryEntry.Value);
-                bsonWriter.WriteEndArray();
-            }
-            bsonWriter.WriteEndArray();
-        }
-
-        private void SerializeArrayOfDocumentsRepresentation(BsonSerializationContext context, TDictionary value)
-        {
-            var bsonWriter = context.Writer;
-            bsonWriter.WriteStartArray();
-            foreach (DictionaryEntry dictionaryEntry in value)
-            {
-                if (dictionaryEntry.Value is not ISerializeToEntity)
-                {
-                    continue;
-                }
-                bsonWriter.WriteStartDocument();
-                bsonWriter.WriteName("k");
-                _keySerializer.Serialize(context, dictionaryEntry.Key);
-                bsonWriter.WriteName("v");
-                _valueSerializer.Serialize(context, dictionaryEntry.Value);
-                bsonWriter.WriteEndDocument();
-            }
-            bsonWriter.WriteEndArray();
-        }
-
-        private void SerializeDocumentRepresentation(BsonSerializationContext context, TDictionary value)
-        {
-            var bsonWriter = context.Writer;
-            bsonWriter.WriteStartDocument();
-            foreach (DictionaryEntry dictionaryEntry in value)
-            {
-                if (dictionaryEntry.Value is not ISerializeToEntity)
-                {
-                    continue;
-                }
-                bsonWriter.WriteName(SerializeKeyString(dictionaryEntry.Key));
-                _valueSerializer.Serialize(context, dictionaryEntry.Value);
-            }
-            bsonWriter.WriteEndDocument();
-        }
-
-        private string SerializeKeyString(object key)
-        {
-            var keyDocument = new BsonDocument();
-            using (var keyWriter = new BsonDocumentWriter(keyDocument))
-            {
-                var context = BsonSerializationContext.CreateRoot(keyWriter);
-                keyWriter.WriteStartDocument();
-                keyWriter.WriteName("k");
-                _keySerializer.Serialize(context, key);
-                keyWriter.WriteEndDocument();
-            }
-
-            var keyValue = keyDocument["k"];
-            if (keyValue.BsonType != BsonType.String)
-            {
-                throw new BsonSerializationException("When using DictionaryRepresentation.Document key values must serialize as strings.");
-            }
-
-            return (string)keyValue;
-        }
-    }
-
-    /// <summary>
-    /// Represents a serializer for dictionaries.
-    /// </summary>
-    /// <typeparam name="TDictionary">The type of the dictionary.</typeparam>
-    /// <typeparam name="TKey">The type of the keys.</typeparam>
-    /// <typeparam name="TValue">The type of the values.</typeparam>
-    public abstract class SortedDictionarySerializerBase<TDictionary, TKey, TValue> :
-        ClassSerializerBase<TDictionary>,
-        IBsonArraySerializer,
-        IBsonDocumentSerializer,
-        IBsonDictionarySerializer
-        where TDictionary : class, IEnumerable<KeyValuePair<TKey, TValue>>
-    {
-        // private constants
-        private static class Flags
-        {
-            public const long Key = 1;
-            public const long Value = 2;
-        }
-
-        // private fields
-        private readonly DictionaryRepresentation _dictionaryRepresentation;
-        private readonly SerializerHelper _helper;
-        private readonly Lazy<IBsonSerializer<TKey>> _lazyKeySerializer;
-        private readonly Lazy<IBsonSerializer<TValue>> _lazyValueSerializer;
-
-        // constructors
-        /// <summary>
-        /// Initializes a new instance of the <see cref="DictionarySerializerBase{TDictionary, TKey, TValue}"/> class.
-        /// </summary>
-        public SortedDictionarySerializerBase()
-            : this(DictionaryRepresentation.Document)
-        {
-        }
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="DictionarySerializerBase{TDictionary, TKey, TValue}" /> class.
-        /// </summary>
-        /// <param name="dictionaryRepresentation">The dictionary representation.</param>
-        public SortedDictionarySerializerBase(DictionaryRepresentation dictionaryRepresentation)
-            : this(dictionaryRepresentation, BsonSerializer.SerializerRegistry)
-        {
-        }
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="DictionarySerializerBase{TDictionary, TKey, TValue}" /> class.
-        /// </summary>
-        /// <param name="dictionaryRepresentation">The dictionary representation.</param>
-        /// <param name="keySerializer">The key serializer.</param>
-        /// <param name="valueSerializer">The value serializer.</param>
-        public SortedDictionarySerializerBase(DictionaryRepresentation dictionaryRepresentation, IBsonSerializer<TKey> keySerializer, IBsonSerializer<TValue> valueSerializer)
-            : this(
-                dictionaryRepresentation,
-                new Lazy<IBsonSerializer<TKey>>(() => keySerializer),
-                new Lazy<IBsonSerializer<TValue>>(() => valueSerializer))
-        {
-            if (keySerializer == null)
-            {
-                throw new ArgumentNullException("keySerializer");
-            }
-            if (valueSerializer == null)
-            {
-                throw new ArgumentNullException("valueSerializer");
-            }
-        }
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="DictionarySerializerBase{TDictionary, TKey, TValue}" /> class.
-        /// </summary>
-        /// <param name="dictionaryRepresentation">The dictionary representation.</param>
-        /// <param name="serializerRegistry">The serializer registry.</param>
-        public SortedDictionarySerializerBase(DictionaryRepresentation dictionaryRepresentation, IBsonSerializerRegistry serializerRegistry)
-            : this(
-                dictionaryRepresentation,
-                new Lazy<IBsonSerializer<TKey>>(() => serializerRegistry.GetSerializer<TKey>()),
-                new Lazy<IBsonSerializer<TValue>>(() => serializerRegistry.GetSerializer<TValue>()))
-        {
-            if (serializerRegistry == null)
-            {
-                throw new ArgumentNullException("serializerRegistry");
-            }
-        }
-
-        private SortedDictionarySerializerBase(
-            DictionaryRepresentation dictionaryRepresentation,
-            Lazy<IBsonSerializer<TKey>> lazyKeySerializer,
-            Lazy<IBsonSerializer<TValue>> lazyValueSerializer)
-        {
-            _dictionaryRepresentation = dictionaryRepresentation;
-            _lazyKeySerializer = lazyKeySerializer;
-            _lazyValueSerializer = lazyValueSerializer;
-
-            _helper = new SerializerHelper
-            (
-                new SerializerHelper.Member("k", Flags.Key),
-                new SerializerHelper.Member("v", Flags.Value)
-            );
-        }
-
-        // public properties
-        /// <summary>
-        /// Gets the dictionary representation.
-        /// </summary>
-        /// <value>
-        /// The dictionary representation.
-        /// </value>
-        public DictionaryRepresentation DictionaryRepresentation
-        {
-            get { return _dictionaryRepresentation; }
-        }
-
-        /// <summary>
-        /// Gets the key serializer.
-        /// </summary>
-        /// <value>
-        /// The key serializer.
-        /// </value>
-        public IBsonSerializer<TKey> KeySerializer
-        {
-            get { return _lazyKeySerializer.Value; }
-        }
-
-        /// <summary>
-        /// Gets the value serializer.
-        /// </summary>
-        /// <value>
-        /// The value serializer.
-        /// </value>
-        public IBsonSerializer<TValue> ValueSerializer
-        {
-            get { return _lazyValueSerializer.Value; }
-        }
-
-        // public methods
-        /// <inheritdoc/>
-        public bool TryGetItemSerializationInfo(out BsonSerializationInfo serializationInfo)
-        {
-            if (_dictionaryRepresentation != DictionaryRepresentation.ArrayOfDocuments)
-            {
-                serializationInfo = null;
-                return false;
-            }
-
-            var serializer = new KeyValuePairSerializer<TKey, TValue>(
-                BsonType.Document,
-                _lazyKeySerializer.Value,
-                _lazyValueSerializer.Value);
-            serializationInfo = new BsonSerializationInfo(
-                null,
-                serializer,
-                serializer.ValueType);
-            return true;
-        }
-
-        /// <inheritdoc/>
-        public bool TryGetMemberSerializationInfo(string memberName, out BsonSerializationInfo serializationInfo)
-        {
-            if (_dictionaryRepresentation != DictionaryRepresentation.Document)
-            {
-                serializationInfo = null;
-                return false;
-            }
-
-            serializationInfo = new BsonSerializationInfo(
-                memberName,
-                _lazyValueSerializer.Value,
-                _lazyValueSerializer.Value.ValueType);
-            return true;
-        }
-
-        // protected methods
-        /// <summary>
-        /// Deserializes a value.
-        /// </summary>
-        /// <param name="context">The deserialization context.</param>
-        /// <param name="args">The deserialization args.</param>
-        /// <returns>A deserialized value.</returns>
-        protected override TDictionary DeserializeValue(BsonDeserializationContext context, BsonDeserializationArgs args)
-        {
-            var bsonReader = context.Reader;
-
-            var bsonType = bsonReader.GetCurrentBsonType();
-            switch (bsonType)
-            {
-                case BsonType.Array:
-                    return DeserializeArrayRepresentation(context);
-                case BsonType.Document:
-                    return DeserializeDocumentRepresentation(context);
-                default:
-                    throw CreateCannotDeserializeFromBsonTypeException(bsonType);
-            }
-        }
-
-        /// <summary>
-        /// Serializes a value.
-        /// </summary>
-        /// <param name="context">The serialization context.</param>
-        /// <param name="args">The serialization args.</param>
-        /// <param name="value">The object.</param>
-        protected override void SerializeValue(BsonSerializationContext context, BsonSerializationArgs args, TDictionary value)
-        {
-            var bsonWriter = context.Writer;
-
-            switch (_dictionaryRepresentation)
-            {
-                case DictionaryRepresentation.Document:
-                    SerializeDocumentRepresentation(context, value);
-                    break;
-
-                case DictionaryRepresentation.ArrayOfArrays:
-                    SerializeArrayOfArraysRepresentation(context, value);
-                    break;
-
-                case DictionaryRepresentation.ArrayOfDocuments:
-                    SerializeArrayOfDocumentsRepresentation(context, value);
-                    break;
-
-                default:
-                    var message = string.Format("'{0}' is not a valid IDictionary<{1}, {2}> representation.",
-                        _dictionaryRepresentation,
-                        BsonUtils.GetFriendlyTypeName(typeof(TKey)),
-                        BsonUtils.GetFriendlyTypeName(typeof(TValue)));
-                    throw new BsonSerializationException(message);
-            }
-        }
-
-        // protected methods
-        /// <summary>
-        /// Creates an accumulator.
-        /// </summary>
-        /// <returns>The accumulator.</returns>
-        protected virtual ICollection<KeyValuePair<TKey, TValue>> CreateAccumulator()
-        {
-#pragma warning disable 618
-            return (ICollection<KeyValuePair<TKey, TValue>>)CreateInstance();
-#pragma warning restore 618
-        }
-
-        // protected methods
-        /// <summary>
-        /// Creates the instance.
-        /// </summary>
-        /// <returns>The instance.</returns>
-        [Obsolete("CreateInstance is deprecated. Please use CreateAccumulator instead.")]
-        protected virtual TDictionary CreateInstance()
-        {
-            throw new NotImplementedException();
-        }
-
-        /// <summary>
-        /// Finalizes an accumulator.
-        /// </summary>
-        /// <param name="accumulator">The accumulator to finalize</param>
-        /// <returns>The instance.</returns>
-        protected virtual TDictionary FinalizeAccumulator(ICollection<KeyValuePair<TKey, TValue>> accumulator)
-        {
-            return (TDictionary)accumulator;
-        }
-
-        // private methods
-        private TDictionary DeserializeArrayRepresentation(BsonDeserializationContext context)
-        {
-
-            var accumulator = CreateAccumulator();
-            var bsonReader = context.Reader;
-            bsonReader.ReadStartArray();
-            while (bsonReader.ReadBsonType() != BsonType.EndOfDocument)
-            {
-                TKey key;
-                TValue value;
-
-                var bsonType = bsonReader.GetCurrentBsonType();
-                switch (bsonType)
-                {
-                    case BsonType.Array:
-                        bsonReader.ReadStartArray();
-                        key = _lazyKeySerializer.Value.Deserialize(context);
-                        value = _lazyValueSerializer.Value.Deserialize(context);
-                        bsonReader.ReadEndArray();
-                        break;
-
-                    case BsonType.Document:
-                        key = default(TKey);
-                        value = default(TValue);
-                        _helper.DeserializeMembers(context, (elementName, flag) =>
-                        {
-                            switch (flag)
-                            {
-                                case Flags.Key: key = _lazyKeySerializer.Value.Deserialize(context); break;
-                                case Flags.Value: value = _lazyValueSerializer.Value.Deserialize(context); break;
-                            }
-                        });
-                        break;
-
-                    default:
-                        throw CreateCannotDeserializeFromBsonTypeException(bsonType);
-                }
-
-                accumulator.Add(new KeyValuePair<TKey, TValue>(key, value));
-            }
-            bsonReader.ReadEndArray();
-
-            return FinalizeAccumulator(accumulator);
-        }
-
-        private TDictionary DeserializeDocumentRepresentation(BsonDeserializationContext context)
-        {
-            var accumulator = CreateAccumulator();
-
-            var bsonReader = context.Reader;
-            bsonReader.ReadStartDocument();
-            while (bsonReader.ReadBsonType() != BsonType.EndOfDocument)
-            {
-                var key = DeserializeKeyString(bsonReader.ReadName());
-                var value = _lazyValueSerializer.Value.Deserialize(context);
-                accumulator.Add(new KeyValuePair<TKey, TValue>(key, value));
-            }
-            bsonReader.ReadEndDocument();
-
-            return FinalizeAccumulator(accumulator);
-        }
-
-        private TKey DeserializeKeyString(string keyString)
-        {
-            var keyDocument = new BsonDocument("k", keyString);
-            using (var keyReader = new BsonDocumentReader(keyDocument))
-            {
-                var context = BsonDeserializationContext.CreateRoot(keyReader);
-                keyReader.ReadStartDocument();
-                keyReader.ReadName("k");
-                var key = _lazyKeySerializer.Value.Deserialize(context);
-                keyReader.ReadEndDocument();
-                return key;
-            }
-        }
-
-        private void SerializeArrayOfArraysRepresentation(BsonSerializationContext context, TDictionary value)
-        {
-            var bsonWriter = context.Writer;
-            bsonWriter.WriteStartArray();
-            foreach (var keyValuePair in value)
-            {
-                if (keyValuePair.Value is not ISerializeToEntity)
-                {
-                    continue;
-                }
-                bsonWriter.WriteStartArray();
-                _lazyKeySerializer.Value.Serialize(context, keyValuePair.Key);
-                _lazyValueSerializer.Value.Serialize(context, keyValuePair.Value);
-                bsonWriter.WriteEndArray();
-            }
-            bsonWriter.WriteEndArray();
-        }
-
-        private void SerializeArrayOfDocumentsRepresentation(BsonSerializationContext context, TDictionary value)
-        {
-            var bsonWriter = context.Writer;
-            bsonWriter.WriteStartArray();
-            foreach (var keyValuePair in value)
-            {
-                if (keyValuePair.Value is not ISerializeToEntity)
-                {
-                    continue;
-                }
-                bsonWriter.WriteStartDocument();
-                bsonWriter.WriteName("k");
-                _lazyKeySerializer.Value.Serialize(context, keyValuePair.Key);
-                bsonWriter.WriteName("v");
-                _lazyValueSerializer.Value.Serialize(context, keyValuePair.Value);
-                bsonWriter.WriteEndDocument();
-            }
-            bsonWriter.WriteEndArray();
-        }
-
-        private void SerializeDocumentRepresentation(BsonSerializationContext context, TDictionary value)
-        {
-            var bsonWriter = context.Writer;
-            bsonWriter.WriteStartDocument();
-            foreach (var keyValuePair in value)
-            {
-                if (keyValuePair.Value is not ISerializeToEntity)
-                {
-                    continue;
-                }
-                bsonWriter.WriteName(SerializeKeyString(keyValuePair.Key));
-                _lazyValueSerializer.Value.Serialize(context, keyValuePair.Value);
-            }
-            bsonWriter.WriteEndDocument();
-        }
-
-        private string SerializeKeyString(TKey key)
-        {
-            var keyDocument = new BsonDocument();
-            using (var keyWriter = new BsonDocumentWriter(keyDocument))
-            {
-                var context = BsonSerializationContext.CreateRoot(keyWriter);
-                keyWriter.WriteStartDocument();
-                keyWriter.WriteName("k");
-                _lazyKeySerializer.Value.Serialize(context, key);
-                keyWriter.WriteEndDocument();
-            }
-
-            var keyValue = keyDocument["k"];
-            if (keyValue.BsonType != BsonType.String)
-            {
-                throw new BsonSerializationException("When using DictionaryRepresentation.Document key values must serialize as strings.");
-            }
-
-            return (string)keyValue;
-        }
-
-        // explicit interface implementations
-        IBsonSerializer IBsonDictionarySerializer.KeySerializer
-        {
-            get { return KeySerializer; }
-        }
-
-        IBsonSerializer IBsonDictionarySerializer.ValueSerializer
-        {
-            get { return ValueSerializer; }
-        }
-    }
-}

+ 2 - 30
Unity/Assets/Scripts/Model/Share/Entry.cs

@@ -1,9 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Reflection;
-using MemoryPack;
-
-namespace ET
+namespace ET
 {
     public struct EntryEvent1
     {
@@ -17,28 +12,6 @@ namespace ET
     {
     }
     
-    [MemoryPackable]
-    [ComponentOf(typeof(Scene))]
-    public partial class AA: Entity, IAwake
-    {
-    }
-
-    [MemoryPackable]
-    [ComponentOf(typeof(AA))]
-    public partial class BB : Entity, IAwake, ISerializeToEntity
-    {
-        [MemoryPackInclude]
-        public int B { get; set; }
-    }
-    
-    [MemoryPackable]
-    [ComponentOf(typeof(AA))]
-    public partial class CC : Entity, IAwake //, ISerializeToEntity
-    {
-        [MemoryPackInclude]
-        public int C { get; set; }
-    }
-    
     public static class Entry
     {
         public static void Init()
@@ -58,8 +31,7 @@ namespace ET
             // 注册Mongo type
             MongoRegister.Init();
             
-            MemoryPackFormatterProvider.Register(new MemoryPackChildrenCollectionFormatter());
-            MemoryPackFormatterProvider.Register(new MemoryPackComponentsCollectionFormatter());
+            MemoryPackRegister.Init();
             
             // 注册Entity序列化器
             EntitySerializeRegister.Init();

+ 13 - 0
Unity/Assets/Scripts/Model/Share/MemoryPackRegister.cs

@@ -0,0 +1,13 @@
+using MemoryPack;
+
+namespace ET
+{
+    public static class MemoryPackRegister
+    {
+        public static void Init()
+        {
+            MemoryPackFormatterProvider.Register(new MemoryPackChildrenCollectionFormatter());
+            MemoryPackFormatterProvider.Register(new MemoryPackComponentsCollectionFormatter());
+        }
+    }
+}

+ 2 - 1
Unity/Assets/Scripts/Model/Share/MongoRegister.cs

@@ -23,7 +23,8 @@ namespace ET
             MethodInfo registerIdGenerators = typeof (BsonSerializer).GetMethod("RegisterIdGenerators", BindingFlags.Static | BindingFlags.NonPublic);
             registerIdGenerators.Invoke(null, Array.Empty<object>());
             
-            BsonSerializer.RegisterSerializer(new BsonSortedDictionaryInterfaceImplementerSerializer<SortedDictionary<long, Entity>>());
+            BsonSerializer.RegisterSerializer(typeof(ComponentsCollection), new BsonComponentsCollectionSerializer());
+            BsonSerializer.RegisterSerializer(typeof(ChildrenCollection), new BsonChildrenCollectionSerializer());
             
             
             // 自动注册IgnoreExtraElements

+ 26 - 0
Unity/Assets/Scripts/Model/Share/SerializerTest.cs

@@ -0,0 +1,26 @@
+using MemoryPack;
+
+namespace ET
+{
+    [MemoryPackable]
+    [ComponentOf(typeof(Scene))]
+    public partial class AA : Entity, IAwake
+    {
+    }
+
+    [MemoryPackable]
+    [ComponentOf(typeof(AA))]
+    public partial class BB : Entity, IAwake, ISerializeToEntity
+    {
+        [MemoryPackInclude]
+        public int B { get; set; }
+    }
+
+    [MemoryPackable]
+    [ComponentOf(typeof(AA))]
+    public partial class CC : Entity, IAwake //, ISerializeToEntity
+    {
+        [MemoryPackInclude]
+        public int C { get; set; }
+    }
+}