浏览代码

Entity加上IsSerilizeWithParent属性,即使没有ISerializeToEntity接口,也能指定Entity是否跟随Parent序列化

tanghai 1 年之前
父节点
当前提交
d66720097e

+ 23 - 5
Unity/Assets/Scripts/Core/Entity/Entity.cs

@@ -15,6 +15,7 @@ namespace ET
         IsComponent = 1 << 2,
         IsCreated = 1 << 3,
         IsNew = 1 << 4,
+        IsSerilizeWithParent = 1 << 5,
     }
 
     [MemoryPackable(GenerateType.NoGenerate)]
@@ -36,13 +37,13 @@ namespace ET
         [BsonIgnore]
         public long InstanceId { get; protected set; }
 
+        [BsonIgnore]
+        private EntityStatus status = EntityStatus.None;
+        
         protected Entity()
         {
         }
 
-        [BsonIgnore]
-        private EntityStatus status = EntityStatus.None;
-
         [MemoryPackIgnore]
         [BsonIgnore]
         public bool IsFromPool
@@ -165,6 +166,23 @@ namespace ET
                 }
             }
         }
+        
+        [BsonIgnore]
+        public bool IsSerilizeWithParent
+        {
+            get => (this.status & EntityStatus.IsSerilizeWithParent) == EntityStatus.IsSerilizeWithParent;
+            set
+            {
+                if (value)
+                {
+                    this.status |= EntityStatus.IsSerilizeWithParent;
+                }
+                else
+                {
+                    this.status &= ~EntityStatus.IsSerilizeWithParent;
+                }
+            }
+        }
 
         [MemoryPackIgnore]
         [BsonIgnore]
@@ -519,7 +537,7 @@ namespace ET
 
             base.Dispose();
             
-            // 把status字段其它的status标记都还原
+            // 把status字段除了IsFromPool其它的status标记都还原
             bool isFromPool = this.IsFromPool;
             this.status = EntityStatus.None;
             this.IsFromPool = isFromPool;
@@ -918,7 +936,7 @@ namespace ET
 
         public override void BeginInit()
         {
-            if (this is not ISerializeToEntity)
+            if (this is not ISerializeToEntity && !this.IsSerilizeWithParent)
             {
                 return;
             }

+ 3 - 3
Unity/Assets/Scripts/Core/Serialize/BsonChildrenCollectionSerializer.cs

@@ -14,6 +14,7 @@ namespace ET
             while (bsonReader.ReadBsonType() != BsonType.EndOfDocument)
             {
                 Entity entity = bsonSerializer.Deserialize(context);
+                entity.IsSerilizeWithParent = true;
                 childrenCollection.Add(entity.Id, entity);
             }
             bsonReader.ReadEndArray();
@@ -30,11 +31,10 @@ namespace ET
             IBsonSerializer<Entity> bsonSerializer = BsonSerializer.LookupSerializer<Entity>();
             foreach ((long _, Entity entity) in childrenCollection)
             {
-                if (entity is not ISerializeToEntity)
+                if (entity is ISerializeToEntity || entity.IsSerilizeWithParent)
                 {
-                    continue;
+                    bsonSerializer.Serialize(context, entity);
                 }
-                bsonSerializer.Serialize(context, entity);
             }
             bsonWriter.WriteEndArray();
         }

+ 3 - 3
Unity/Assets/Scripts/Core/Serialize/BsonComponentsCollectionSerializer.cs

@@ -15,6 +15,7 @@ namespace ET
             while (bsonReader.ReadBsonType() != BsonType.EndOfDocument)
             {
                 Entity entity = bsonSerializer.Deserialize(context);
+                entity.IsSerilizeWithParent = true;
                 componentsCollection.Add(Entity.GetLongHashCodeByType(entity.GetType()), entity);
             }
             bsonReader.ReadEndArray();
@@ -31,11 +32,10 @@ namespace ET
             IBsonSerializer<Entity> bsonSerializer = BsonSerializer.LookupSerializer<Entity>();
             foreach ((long _, Entity entity) in componentsCollection)
             {
-                if (entity is not ISerializeToEntity)
+                if (entity is ISerializeToEntity || entity.IsSerilizeWithParent)
                 {
-                    continue;
+                    bsonSerializer.Serialize(context, entity);
                 }
-                bsonSerializer.Serialize(context, entity);
             }
             bsonWriter.WriteEndArray();
         }

+ 5 - 6
Unity/Assets/Scripts/Core/Serialize/MemoryPackChildrenCollectionFormatter.cs

@@ -33,14 +33,12 @@ namespace ET
             int count = 0;
             foreach (var kv in value)
             {
-                if (kv.Value is not ISerializeToEntity)
+                Entity entity = kv.Value;
+                if (entity is ISerializeToEntity || entity.IsSerilizeWithParent)
                 {
-                    continue;
+                    ++count;
+                    formatter.Serialize(ref writer, ref entity!);
                 }
-
-                Entity entity = kv.Value;
-                ++count;
-                formatter.Serialize(ref writer, ref entity!);
             }
             Unsafe.WriteUnaligned(ref spanReference, count);
         }
@@ -72,6 +70,7 @@ namespace ET
             {
                 Entity entity = null!;
                 formatter.Deserialize(ref reader, ref entity!);
+                entity.IsSerilizeWithParent = true;
                 value.Add(entity.Id, entity);
             }
         }

+ 5 - 6
Unity/Assets/Scripts/Core/Serialize/MemoryPackComponentsCollectionFormatter.cs

@@ -33,14 +33,12 @@ namespace ET
             int count = 0;
             foreach (var kv in value)
             {
-                if (kv.Value is not ISerializeToEntity)
+                Entity entity = kv.Value;
+                if (entity is ISerializeToEntity || entity.IsSerilizeWithParent)
                 {
-                    continue;
+                    ++count;
+                    formatter.Serialize(ref writer, ref entity!);
                 }
-
-                Entity entity = kv.Value;
-                ++count;
-                formatter.Serialize(ref writer, ref entity!);
             }
             Unsafe.WriteUnaligned(ref spanReference, count);
         }
@@ -73,6 +71,7 @@ namespace ET
             {
                 Entity entity = null!;
                 formatter.Deserialize(ref reader, ref entity!);
+                entity.IsSerilizeWithParent = true;
                 long key = Entity.GetLongHashCodeByType(entity.GetType());
                 value.Add(key, entity);
             }

+ 1 - 0
Unity/Assets/Scripts/Hotfix/Share/FiberInit_Main.cs

@@ -21,6 +21,7 @@ namespace ET
             CC cc = aa.AddComponent<CC>();
             bb.B = 1;
             cc.C = 2;
+            cc.IsSerilizeWithParent = true;
 
             byte[] bytes = MemoryPackSerializer.Serialize(aa);
 

+ 1 - 1
Unity/Assets/Scripts/Core/Serialize/BsonSortedDictionaryInterfaceImplementerSerializer.cs.meta → Unity/Assets/Scripts/Model/Share/MemoryPackRegister.cs.meta

@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 8bab69cac2e2e6c449839a3e28dd28c3
+guid: aac37bc7d39acd44b8ff5c343769935d
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2

+ 1 - 1
Unity/Assets/Scripts/Core/Serialize/BsonSortedDictionarySerializerBase.cs.meta → Unity/Assets/Scripts/Model/Share/SerializerTest.cs.meta

@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 85b74f85898776947981777ecfd95f3c
+guid: df88fd1b86957ec4596caf1dfd5f7c57
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2