4 using System.Collections.Generic;
5 using SiliconStudio.Core.Storage;
7 namespace SiliconStudio.Core.Serialization
11 private readonly List<Action<DataSerializerFactory>> serializationProfileInitializers;
12 private int serializationProfileInitializerCount;
14 private readonly Dictionary<ObjectId, DataSerializer> dataSerializersById =
new Dictionary<ObjectId, DataSerializer>();
15 private readonly Dictionary<Type, KeyValuePair<ObjectId, DataSerializer>> dataSerializersByType =
new Dictionary<Type, KeyValuePair<ObjectId, DataSerializer>>();
17 public static readonly Dictionary<string, List<Action<DataSerializerFactory>>> SerializationProfileInitializers =
new Dictionary<string, List<Action<DataSerializerFactory>>>();
21 lock (SerializationProfileInitializers)
23 List<Action<DataSerializerFactory>> existingSerializationProfileInitializers;
26 if (!SerializationProfileInitializers.TryGetValue(profileName, out existingSerializationProfileInitializers))
28 existingSerializationProfileInitializers =
new List<Action<DataSerializerFactory>>();
29 SerializationProfileInitializers.Add(profileName, existingSerializationProfileInitializers);
33 existingSerializationProfileInitializers.Add(serializationProfileInitializer);
39 lock (SerializationProfileInitializers)
42 var serializationProfileInitializers = SerializationProfileInitializers[profileName];
45 return dataSerializerFactory;
51 this.serializationProfileInitializers = serializationProfileInitializers;
52 this.serializationProfileInitializerCount = 0;
61 lock (dataSerializersByType)
63 serializer.SerializationTypeId = id;
64 dataSerializersByType[serializer.SerializationType] =
new KeyValuePair<ObjectId, DataSerializer>(id, serializer);
65 dataSerializersById[id] = serializer;
75 lock (dataSerializersByType)
77 dataSerializersByType[type] =
new KeyValuePair<ObjectId, DataSerializer>(id, null);
78 dataSerializersById[id] = null;
91 CheckForNewAssemblies();
93 return dataSerializersByType.ContainsKey(type);
105 CheckForNewAssemblies();
107 return dataSerializersById.ContainsKey(typeId);
110 private void CheckForNewAssemblies()
113 if (serializationProfileInitializers.Count > serializationProfileInitializerCount)
115 lock (SerializationProfileInitializers)
117 var start = serializationProfileInitializerCount;
118 serializationProfileInitializerCount = serializationProfileInitializers.Count;
121 for (
int i = start; i < serializationProfileInitializers.Count; ++i)
123 serializationProfileInitializers[i](
this);
136 return dataSerializersByType[type];
146 return dataSerializersById[typeId];
void RegisterNullSerializer(ObjectId id, Type type)
Registers the type has having no serializer (useful for abstract types, interfaces and special types ...
void RegisterSerializer(ObjectId id, DataSerializer serializer)
Registers the serializer.
KeyValuePair< ObjectId, DataSerializer > GetSerializer(Type type)
Gets the (de)serializer. It should only be called if CanSerialize(type) is true.
static void RegisterSerializationProfile(string profileName, Action< DataSerializerFactory > serializationProfileInitializer)
bool CanSerialize(Type type)
Should return true when factory is able to create a DataSerializer{T} for this type.
DataSerializerFactory(List< Action< DataSerializerFactory >> serializationProfileInitializers)
A hash to uniquely identify data.
Describes how to serialize and deserialize an object without knowing its type. Used as a common base ...
bool CanSerialize(ref ObjectId typeId)
Should return true when factory is able to create a DataSerializer{T} for this type.
static DataSerializerFactory CreateDataSerializerFactory(string profileName)
DataSerializer GetSerializer(ref ObjectId typeId)
Gets the (de)serializer. It should only be called if CanSerialize(type) is true.