4 using System.Collections;
5 using System.Collections.Generic;
7 using System.Reflection;
9 using SiliconStudio.Core;
10 using SiliconStudio.Core.Reflection;
11 using SiliconStudio.Core.Serialization;
12 using SiliconStudio.Core.Serialization.Converters;
14 namespace SiliconStudio.
Paradox.EntityModel
20 if (entityComponent == null)
21 entityComponent =
new T();
28 stream.Write(entityComponent.Entity);
29 stream.Write(EntityComponentData.GenerateEntityComponentData(entityComponent));
33 var entity = stream.Read<
Entity>();
35 var data = stream.Read<EntityComponentData>();
36 EntityComponentData.RestoreEntityComponentData(entityComponent, data);
42 internal class EntityComponentData
47 [DataMemberCustomSerializer]
49 public List<EntityComponentProperty> Properties;
52 public static void RestoreEntityComponentData(EntityComponent entityComponent, EntityComponentData data)
54 foreach (var componentProperty
in data.Properties)
56 switch (componentProperty.Type)
58 case EntityComponentPropertyType.Field:
60 var field = entityComponent.GetType().GetTypeInfo().GetDeclaredField(componentProperty.Name);
63 var result = MergeObject(field.GetValue(entityComponent), componentProperty.Value);
64 field.SetValue(entityComponent, result);
67 case EntityComponentPropertyType.Property:
69 var
property = entityComponent.GetType().GetTypeInfo().GetDeclaredProperty(componentProperty.Name);
72 var result = MergeObject(property.GetValue(entityComponent, null), componentProperty.Value);
73 if (property.CanWrite)
74 property.SetValue(entityComponent, result, null);
78 throw new NotImplementedException();
83 public static EntityComponentData GenerateEntityComponentData(EntityComponent entityComponent)
85 var data =
new EntityComponentData { Properties =
new List<EntityComponentProperty>() };
86 foreach (var field
in entityComponent.GetType().GetTypeInfo().DeclaredFields)
94 foreach (var property
in entityComponent.GetType().GetTypeInfo().DeclaredProperties)
99 data.Properties.Add(
new EntityComponentProperty(
EntityComponentPropertyType.Property, property.Name, property.GetValue(entityComponent, null)));
104 private static object MergeObject(
object oldValue,
object newValue)
106 if (oldValue is IList)
108 var oldList = (IList)oldValue;
118 var oldDictionary = (IDictionary)oldValue;
119 oldDictionary.Clear();
120 foreach (DictionaryEntry item
in (IDictionary)newValue)
122 oldDictionary.Add(item.Key, item.Value);
124 return oldDictionary;
Game entity. It usually aggregates multiple EntityComponent
override void PreSerialize(ref T entityComponent, ArchiveMode mode, SerializationStream stream)
Base class for implementation of SerializationStream.
Describes how to serialize and deserialize an object without knowing its type. Used as a common base ...
ArchiveMode
Enumerates the different mode of serialization (either serialization or deserialization).
override void Serialize(ref T entityComponent, ArchiveMode mode, SerializationStream stream)
A class that represents a tag propety.
EntityComponentPropertyType