3 using SiliconStudio.Core.Serialization;
5 using System.Collections.Generic;
8 using System.Threading.Tasks;
9 using SiliconStudio.Core.Serialization.Assets;
10 using SiliconStudio.Core.Serialization.Converters;
11 using SiliconStudio.Core.Serialization.Serializers;
14 namespace SiliconStudio.Core.Serialization.Contents
17 [DataSerializerGlobal(typeof(ListSerializer<ChunkReference>))]
20 internal readonly List<ChunkReference> chunkReferences =
new List<ChunkReference>();
21 private readonly Dictionary<Type, int> objectsPerType =
new Dictionary<Type, int>();
22 private readonly HashSet<object> generatedUrlObjects =
new HashSet<object>();
23 private string generatedUrlPrefix;
28 public string Url {
get;
protected set; }
31 public List<ContentReference> ContentReferences {
get; set; }
35 public bool RegenerateUrls {
get; set; }
37 internal AssetManager.AssetReference AssetReference {
get; set; }
44 ContentReferences =
new List<ContentReference>();
45 generatedUrlPrefix = Url +
"/gen/";
50 if (contentReference == null)
51 return ChunkReference.NullIdentifier;
57 var serializer = AssetManager.Serializer.GetSerializer(null, contentReference.ObjectValue.GetType());
58 BuildUrl(contentReference, serializer.ActualType);
60 ContentReferences.Add(contentReference);
63 return AddChunkReference(contentReference.
Location, contentReference.
Type);
71 var chunkReference = GetChunkReference(index);
75 ContentReferences.Add(contentReference);
77 return contentReference;
82 return chunkReferences[index];
88 for (
int i = chunkReferences.Count - 1; i >= 0; --i)
90 var currentReference = chunkReferences[i];
91 if (currentReference.Location == url && currentReference.ObjectType == type)
98 var index = chunkReferences.Count;
99 chunkReferences.Add(reference);
106 var content = contentReference.ObjectValue;
107 string url = contentReference.Location;
113 if (url == null || (RegenerateUrls && url.StartsWith(generatedUrlPrefix) && !generatedUrlObjects.Contains(content)))
118 contentReference.Location = url;
122 generatedUrlObjects.Add(content);
126 var contentType = content.GetType();
130 objectsPerType.TryGetValue(contentType, out currentCount);
131 objectsPerType[contentType] = ++currentCount;
133 contentReference.Location = string.Format(
"{0}{1}_{2}", generatedUrlPrefix, content.GetType().Name, currentCount);
143 stream.Context.SerializerSelector = AssetManager.Serializer.LowLevelSerializerSelector;
144 serializer.Serialize(
this, stream, ref objToSerialize);
145 return objToSerialize;
150 var references = chunkReferences;
151 stream.Context.SerializerSelector = AssetManager.Serializer.LowLevelSerializerSelector;
152 stream.Serialize(ref references, Mode);
ChunkReference GetChunkReference(int index)
ContentReferenceState State
int AddChunkReference(string url, Type type)
Base class for implementation of SerializationStream.
object SerializeContent(SerializationStream stream, IContentSerializer serializer, object objToSerialize)
void SerializeReferences(SerializationStream stream)
abstract string Location
Gets or sets the URL of the referenced data.
bool TryGetAssetUrl(object obj, out string url)
ArchiveMode
Enumerates the different mode of serialization (either serialization or deserialization).
abstract object ObjectValue
int AddContentReference(ContentReference contentReference)
Describe a reference between an object and another.
A class that represents a tag propety.
void BuildUrl(ContentReference contentReference, Type serializationType)