Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
AssetSerializer.cs
Go to the documentation of this file.
1 // Copyright (c) 2014 Silicon Studio Corp. (http://siliconstudio.co.jp)
2 // This file is distributed under GPL v3. See LICENSE.md for details.
3 using System;
4 using System.Collections.Generic;
5 using System.IO;
6 using SiliconStudio.Assets.Serializers;
7 using SiliconStudio.Core;
8 
9 namespace SiliconStudio.Assets
10 {
11  /// <summary>
12  /// Main entry point for serializing/deserializing <see cref="Asset"/>.
13  /// </summary>
14  public class AssetSerializer
15  {
16  private static readonly List<IAssetSerializerFactory> RegisteredSerializerFactories = new List<IAssetSerializerFactory>();
17 
18  /// <summary>
19  /// The default serializer.
20  /// </summary>
21  public static readonly IAssetSerializer Default = new AssetYamlSerializer();
22 
23  private AssetSerializer()
24  {
25  }
26 
27  static AssetSerializer()
28  {
29  Register((IAssetSerializerFactory)Default);
30  Register(SourceCodeAssetSerializer.Default);
31  }
32 
33  /// <summary>
34  /// Registers the specified serializer factory.
35  /// </summary>
36  /// <param name="serializerFactory">The serializer factory.</param>
37  /// <exception cref="System.ArgumentNullException">serializerFactory</exception>
38  public static void Register(IAssetSerializerFactory serializerFactory)
39  {
40  if (serializerFactory == null) throw new ArgumentNullException("serializerFactory");
41  if (!RegisteredSerializerFactories.Contains(serializerFactory))
42  RegisteredSerializerFactories.Add(serializerFactory);
43  }
44 
45  /// <summary>
46  /// Finds a serializer for the specified asset file extension.
47  /// </summary>
48  /// <param name="assetFileExtension">The asset file extension.</param>
49  /// <returns>IAssetSerializerFactory.</returns>
50  public static IAssetSerializer FindSerializer(string assetFileExtension)
51  {
52  if (assetFileExtension == null) throw new ArgumentNullException("assetFileExtension");
53  assetFileExtension = assetFileExtension.ToLowerInvariant();
54  for (int i = RegisteredSerializerFactories.Count - 1; i >= 0; i--)
55  {
56  var assetSerializerFactory = RegisteredSerializerFactories[i];
57  var factory = assetSerializerFactory.TryCreate(assetFileExtension);
58  if (factory != null)
59  {
60  return factory;
61  }
62  }
63  return null;
64  }
65 
66  /// <summary>
67  /// Deserializes an <see cref="Asset" /> from the specified stream.
68  /// </summary>
69  /// <typeparam name="T">Type of the asset</typeparam>
70  /// <param name="filePath">The file path.</param>
71  /// <returns>An instance of Asset not a valid asset asset object file.</returns>
72  public static T Load<T>(string filePath)
73  {
74  return (T)Load(filePath);
75  }
76 
77  /// <summary>
78  /// Deserializes an <see cref="Asset" /> from the specified stream.
79  /// </summary>
80  /// <param name="filePath">The file path.</param>
81  /// <returns>An instance of Asset not a valid asset asset object file.</returns>
82  public static object Load(string filePath)
83  {
84  using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
85  {
86  return Load(stream, Path.GetExtension(filePath));
87  }
88  }
89 
90  /// <summary>
91  /// Deserializes an <see cref="Asset" /> from the specified stream.
92  /// </summary>
93  /// <param name="stream">The stream.</param>
94  /// <param name="assetFileExtension">The asset file extension expected when loading the asset (use to find a <see cref="IAssetSerializer"/> with <see cref="IAssetSerializerFactory"/>).</param>
95  /// <returns>An instance of Asset not a valid asset asset object file.</returns>
96  public static object Load(Stream stream, string assetFileExtension)
97  {
98  if (assetFileExtension == null) throw new ArgumentNullException("assetFileExtension");
99  assetFileExtension = assetFileExtension.ToLowerInvariant();
100 
101  var serializer = FindSerializer(assetFileExtension);
102  if (serializer == null)
103  {
104  throw new InvalidOperationException("Unable to find a serializer for [{0}]".ToFormat(assetFileExtension));
105  }
106  var asset = serializer.Load(stream, assetFileExtension);
107  return asset;
108  }
109 
110  /// <summary>
111  /// Serializes an <see cref="Asset" /> to the specified file path.
112  /// </summary>
113  /// <param name="filePath">The file path.</param>
114  /// <param name="asset">The asset object.</param>
115  /// <exception cref="System.ArgumentNullException">filePath</exception>
116  public static void Save(string filePath, object asset)
117  {
118  if (filePath == null) throw new ArgumentNullException("filePath");
119 
120  // Creates automatically the directory when saving an asset.
121  filePath = FileUtility.GetAbsolutePath(filePath);
122  var directoryPath = Path.GetDirectoryName(filePath);
123  if (directoryPath != null && !Directory.Exists(directoryPath))
124  {
125  Directory.CreateDirectory(directoryPath);
126  }
127 
128  using (var stream = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.Write))
129  {
130  Save(stream, asset);
131  }
132  }
133 
134  /// <summary>
135  /// Serializes an <see cref="Asset" /> to the specified stream.
136  /// </summary>
137  /// <param name="stream">The stream.</param>
138  /// <param name="asset">The asset object.</param>
139  /// <exception cref="System.ArgumentNullException">
140  /// stream
141  /// or
142  /// assetFileExtension
143  /// </exception>
144  public static void Save(Stream stream, object asset)
145  {
146  if (stream == null) throw new ArgumentNullException("stream");
147  if (asset == null) return;
148 
149  var assetFileExtension = AssetRegistry.GetDefaultExtension(asset.GetType());
150  if (assetFileExtension == null)
151  {
152  throw new ArgumentException("Unable to find a serializer for the specified asset. No asset file extension registered to AssetRegistry");
153  }
154 
155  var serializer = FindSerializer(assetFileExtension);
156  if (serializer == null)
157  {
158  throw new InvalidOperationException("Unable to find a serializer for [{0}]".ToFormat(assetFileExtension));
159  }
160  serializer.Save(stream, asset);
161  }
162  }
163 }
System.IO.FileMode FileMode
Definition: ScriptSync.cs:33
static object Load(string filePath)
Deserializes an Asset from the specified stream.
Use the default mode depending on the type of the field/property.
static void Save(Stream stream, object asset)
Serializes an Asset to the specified stream.
Main entry point for serializing/deserializing Asset.
static IAssetSerializer FindSerializer(string assetFileExtension)
Finds a serializer for the specified asset file extension.
static void Save(string filePath, object asset)
Serializes an Asset to the specified file path.
static void Register(IAssetSerializerFactory serializerFactory)
Registers the specified serializer factory.
static object Load(Stream stream, string assetFileExtension)
Deserializes an Asset from the specified stream.