4 using System.Collections.Generic;
5 using SiliconStudio.Core.Serialization.Serializers;
6 using SiliconStudio.Core.Storage;
8 namespace SiliconStudio.Core.Serialization
37 Tags.SetObject(key, value);
46 private readonly List<DataSerializerFactory> dataSerializerFactories =
new List<DataSerializerFactory>();
47 private readonly Dictionary<Type, DataSerializer> dataSerializersByType =
new Dictionary<Type, DataSerializer>();
48 private readonly Dictionary<ObjectId, DataSerializer> dataSerializersByTypeId =
new Dictionary<ObjectId, DataSerializer>();
62 Default.RegisterProfile(
"Default");
65 DefaultWithReuse.RegisterProfile(
"Default");
66 DefaultWithReuse.ReuseReferences =
true;
76 public bool ReuseReferences {
get; set; }
78 public bool HashOnly {
get; set; }
92 dataSerializerFactories.Add(factory);
103 lock (dataSerializersByType)
105 PrepareSerializer(serializer);
106 dataSerializersByType[typeof(T)] = serializer;
107 dataSerializersByTypeId[serializer.SerializationTypeId] = serializer;
115 lock (dataSerializersByType)
118 if (!dataSerializersByTypeId.TryGetValue(typeId, out dataSerializer))
121 for (
int index = dataSerializerFactories.Count - 1; index >= 0; index--)
123 var dataSerializerFactory = dataSerializerFactories[index];
124 if (!dataSerializerFactory.CanSerialize(ref typeId))
128 dataSerializer = dataSerializerFactory.GetSerializer(ref typeId);
129 dataSerializersByType[dataSerializer.SerializationType] = dataSerializer;
130 dataSerializersByTypeId[typeId] = dataSerializer;
132 if (dataSerializer != null)
133 PrepareSerializer(dataSerializer);
135 return dataSerializer;
141 return dataSerializer;
151 var typeName = dataSerializer.SerializationType.FullName;
152 dataSerializer.SerializationTypeId = ObjectId.FromBytes(System.Text.Encoding.UTF8.GetBytes(typeName));
155 if (dataSerializer is IDataSerializerInitializer)
156 ((IDataSerializerInitializer)dataSerializer).Initialize(
this);
166 lock (dataSerializersByType)
169 if (!dataSerializersByType.TryGetValue(type, out dataSerializer))
172 for (
int index = dataSerializerFactories.Count - 1; index >= 0; index--)
174 var dataSerializerFactory = dataSerializerFactories[index];
175 if (!dataSerializerFactory.CanSerialize(type))
179 var dataSerializerWithId = dataSerializerFactory.GetSerializer(type);
180 dataSerializer = dataSerializerWithId.Value;
181 dataSerializersByType[type] = dataSerializer;
182 dataSerializersByTypeId[dataSerializerWithId.Key] = dataSerializer;
184 if (dataSerializer != null)
185 PrepareSerializer(dataSerializer);
187 return dataSerializer;
193 return dataSerializer;
delegate void SerializeObjectDelegate(SerializationStream stream, ref object obj, ArchiveMode archiveMode)
Represents a container that can hold properties, lightweight to embed (lazy initialized).
DataSerializer GetSerializer(ref ObjectId typeId)
Use the default mode depending on the type of the field/property.
SerializerSelector RegisterProfile(string profileName)
ObjectId SerializationTypeId
A class that represents a typed tag propety.
static readonly ObjectId Empty
Serializer context. It holds DataSerializer{T} objects and their factories.
A hash to uniquely identify data.
SerializerSelector RegisterFactory(DataSerializerFactory factory)
Registers the DataSerializer{T} factory.
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).
Describes how to serialize and deserialize an object of a given type.
DataSerializer GetSerializer(Type type)
Gets the serializer.
static DataSerializerFactory CreateDataSerializerFactory(string profileName)