5 using System.Globalization;
9 using SharpYaml.Events;
10 using SharpYaml.Serialization;
11 using SiliconStudio.Assets.Serializers;
12 using SiliconStudio.Core.Diagnostics;
13 using SiliconStudio.Core.Yaml;
15 namespace SiliconStudio.Assets
25 var assetFileExtension = Path.GetExtension(assetFullPath);
26 if (assetFileExtension == null)
29 assetFileExtension = assetFileExtension.ToLowerInvariant();
31 var serializer = AssetSerializer.FindSerializer(assetFileExtension);
32 if (!(serializer is AssetYamlSerializer))
36 var serializedVersion = 0;
37 var expectedVersion = 0;
42 using (var streamReader =
new StreamReader(assetFullPath))
44 var yamlEventReader =
new EventReader(
new Parser(streamReader));
47 yamlEventReader.Expect<StreamStart>();
48 yamlEventReader.Expect<DocumentStart>();
49 var mappingStart = yamlEventReader.Expect<MappingStart>();
51 var yamlSerializerSettings = YamlSerializer.GetSerializerSettings();
52 var tagTypeRegistry = yamlSerializerSettings.TagTypeRegistry;
53 assetType = tagTypeRegistry.TypeFromTag(mappingStart.Tag);
55 expectedVersion = AssetRegistry.GetFormatVersion(assetType);
58 while ((assetKey = yamlEventReader.Allow<Scalar>()) != null)
61 if (assetKey.Value ==
"Id")
63 yamlEventReader.Skip();
66 if (assetKey.Value ==
"SerializedVersion")
68 serializedVersion = Convert.ToInt32(yamlEventReader.Expect<Scalar>().Value, CultureInfo.InvariantCulture);
74 if (serializedVersion > expectedVersion)
77 throw new InvalidOperationException(
string.Format(
"Asset of type {0} has been serialized with newer version {1}, but only version {2} is supported. Was this asset created with a newer version of Paradox?", assetType, serializedVersion, expectedVersion));
80 if (serializedVersion < expectedVersion)
83 log.Info(
"{0} needs update, from version {0} to version {1}", Path.GetFullPath(assetFullPath), serializedVersion, expectedVersion);
86 var input =
new StringReader(
File.ReadAllText(assetFullPath));
87 var yamlStream =
new YamlStream();
88 yamlStream.Load(input);
89 var yamlRootNode = (YamlMappingNode)yamlStream.Documents[0].RootNode;
93 if (assetUpdaterTypes == null)
95 throw new InvalidOperationException(
string.Format(
"Asset of type {0} should be updated from version {1} to {2}, but no asset migration path was found", assetType, serializedVersion, expectedVersion));
99 var assetUpgraders = assetUpdaterTypes.Select(x => (
IAssetUpgrader)Activator.CreateInstance(x)).ToArray();
103 if (assetUpgraders.Length != 1)
105 throw new InvalidOperationException(
string.Format(
"Asset of type {0} has multiple migration paths, but selecting the right one is not implemented yet.", assetType));
109 assetUpgraders[0].Upgrade(log, yamlRootNode);
112 YamlNode serializedVersionNode;
113 serializedVersion = 0;
114 if (yamlRootNode.Children.TryGetValue(
new YamlScalarNode(
"SerializedVersion"), out serializedVersionNode))
116 serializedVersion = Convert.ToInt32(((YamlScalarNode)serializedVersionNode).Value);
119 if (serializedVersion != expectedVersion)
121 throw new InvalidOperationException(
string.Format(
"Asset of type {0} was migrated, but still its new version {1} doesn't match expected version {2}.", assetType, serializedVersion, expectedVersion));
124 var preferredIndent = YamlSerializer.GetSerializerSettings().PreferredIndent;
127 using (var streamWriter =
new StreamWriter(assetFullPath))
128 yamlStream.Save(streamWriter,
true, preferredIndent);
A registry for file extensions, IAssetImporter, IAssetFactory and aliases associated with assets...
Helper for migrating asset to newer versions.
static bool MigrateAssetIfNeeded(ILogger log, string assetFullPath)
static Type[] GetFormatVersionUpdaterTypes(Type assetType)
Gets the current format version of an asset.