Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
PrimitiveTypeSerializers.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.Runtime.InteropServices;
5 
6 namespace SiliconStudio.Core.Serialization.Serializers
7 {
8  /// <summary>
9  /// Data serializer for string.
10  /// </summary>
11  [DataSerializerGlobal(typeof(UriSerializer))]
12  public class UriSerializer : DataSerializer<System.Uri>
13  {
14  /// <inheritdoc/>
15  public override void Serialize(ref System.Uri obj, ArchiveMode mode, SerializationStream stream)
16  {
17  if (mode == ArchiveMode.Serialize)
18  {
19  var text = obj.ToString();
20  stream.Serialize(ref text);
21  }
22  else
23  {
24  string text = null;
25  stream.Serialize(ref text);
26  obj = new Uri(text);
27  }
28  }
29  }
30 
31  /// <summary>
32  /// Data serializer for string.
33  /// </summary>
34  [DataSerializerGlobal(typeof(StringSerializer))]
35  public class StringSerializer : DataSerializer<string>
36  {
37  /// <inheritdoc/>
38  public override void Serialize(ref string obj, ArchiveMode mode, SerializationStream stream)
39  {
40  stream.Serialize(ref obj);
41  }
42  }
43 
44  /// <summary>
45  /// Data serializer for bool.
46  /// </summary>
47  [DataSerializerGlobal(typeof(BoolSerializer))]
48  public class BoolSerializer : DataSerializer<bool>
49  {
50  /// <inheritdoc/>
51  public override void Serialize(ref bool obj, ArchiveMode mode, SerializationStream stream)
52  {
53  stream.Serialize(ref obj);
54  }
55  }
56 
57  /// <summary>
58  /// Data serializer for float.
59  /// </summary>
60  [DataSerializerGlobal(typeof(SingleSerializer))]
61  public class SingleSerializer : DataSerializer<float>
62  {
63  /// <inheritdoc/>
64  public override bool IsBlittable { get { return true; } }
65 
66  /// <inheritdoc/>
67  public override void Serialize(ref float obj, ArchiveMode mode, SerializationStream stream)
68  {
69  stream.Serialize(ref obj);
70  }
71  }
72 
73  /// <summary>
74  /// Data serializer for double.
75  /// </summary>
76  [DataSerializerGlobal(typeof(DoubleSerializer))]
77  public class DoubleSerializer : DataSerializer<double>
78  {
79  /// <inheritdoc/>
80  public override bool IsBlittable { get { return true; } }
81 
82  /// <inheritdoc/>
83  public override void Serialize(ref double obj, ArchiveMode mode, SerializationStream stream)
84  {
85  stream.Serialize(ref obj);
86  }
87  }
88 
89  /// <summary>
90  /// Data serializer for char.
91  /// </summary>
92  [DataSerializerGlobal(typeof(CharSerializer))]
93  public class CharSerializer : DataSerializer<char>
94  {
95  /// <inheritdoc/>
96  public override void Serialize(ref char obj, ArchiveMode mode, SerializationStream stream)
97  {
98  stream.Serialize(ref obj);
99  }
100  }
101 
102  /// <summary>
103  /// Data serializer for byte.
104  /// </summary>
105  [DataSerializerGlobal(typeof(ByteSerializer))]
106  public class ByteSerializer : DataSerializer<byte>
107  {
108  /// <inheritdoc/>
109  public override bool IsBlittable { get { return true; } }
110 
111  /// <inheritdoc/>
112  public override void Serialize(ref byte obj, ArchiveMode mode, SerializationStream stream)
113  {
114  stream.Serialize(ref obj);
115  }
116  }
117 
118  /// <summary>
119  /// Data serializer for sbyte.
120  /// </summary>
121  [DataSerializerGlobal(typeof(SByteSerializer))]
122  public class SByteSerializer : DataSerializer<sbyte>
123  {
124  /// <inheritdoc/>
125  public override bool IsBlittable { get { return true; } }
126 
127  /// <inheritdoc/>
128  public override void Serialize(ref sbyte obj, ArchiveMode mode, SerializationStream stream)
129  {
130  stream.Serialize(ref obj);
131  }
132  }
133 
134  /// <summary>
135  /// Data serializer for short.
136  /// </summary>
137  [DataSerializerGlobal(typeof(Int16Serializer))]
138  public class Int16Serializer : DataSerializer<short>
139  {
140  /// <inheritdoc/>
141  public override bool IsBlittable { get { return true; } }
142 
143  /// <inheritdoc/>
144  public override void Serialize(ref short obj, ArchiveMode mode, SerializationStream stream)
145  {
146  stream.Serialize(ref obj);
147  }
148  }
149 
150  /// <summary>
151  /// Data serializer for ushort.
152  /// </summary>
153  [DataSerializerGlobal(typeof(UInt16Serializer))]
154  public class UInt16Serializer : DataSerializer<ushort>
155  {
156  /// <inheritdoc/>
157  public override bool IsBlittable { get { return true; } }
158 
159  /// <inheritdoc/>
160  public override void Serialize(ref ushort obj, ArchiveMode mode, SerializationStream stream)
161  {
162  stream.Serialize(ref obj);
163  }
164  }
165 
166  /// <summary>
167  /// Data serializer for int.
168  /// </summary>
169  [DataSerializerGlobal(typeof(Int32Serializer))]
170  public class Int32Serializer : DataSerializer<int>
171  {
172  /// <inheritdoc/>
173  public override bool IsBlittable { get { return true; } }
174 
175  /// <inheritdoc/>
176  public override void Serialize(ref int obj, ArchiveMode mode, SerializationStream stream)
177  {
178  stream.Serialize(ref obj);
179  }
180  }
181 
182  /// <summary>
183  /// Data serializer for uint.
184  /// </summary>
185  [DataSerializerGlobal(typeof(UInt32Serializer))]
186  public class UInt32Serializer : DataSerializer<uint>
187  {
188  /// <inheritdoc/>
189  public override bool IsBlittable { get { return true; } }
190 
191  /// <inheritdoc/>
192  public override void Serialize(ref uint obj, ArchiveMode mode, SerializationStream stream)
193  {
194  stream.Serialize(ref obj);
195  }
196  }
197 
198  /// <summary>
199  /// Data serializer for long.
200  /// </summary>
201  [DataSerializerGlobal(typeof(Int64Serializer))]
202  public class Int64Serializer : DataSerializer<long>
203  {
204  /// <inheritdoc/>
205  public override bool IsBlittable { get { return true; } }
206 
207  /// <inheritdoc/>
208  public override void Serialize(ref long obj, ArchiveMode mode, SerializationStream stream)
209  {
210  stream.Serialize(ref obj);
211  }
212  }
213 
214  /// <summary>
215  /// Data serializer for ulong.
216  /// </summary>
217  [DataSerializerGlobal(typeof(UInt64Serializer))]
218  public class UInt64Serializer : DataSerializer<ulong>
219  {
220  /// <inheritdoc/>
221  public override bool IsBlittable { get { return true; } }
222 
223  /// <inheritdoc/>
224  public override void Serialize(ref ulong obj, ArchiveMode mode, SerializationStream stream)
225  {
226  stream.Serialize(ref obj);
227  }
228  }
229 
230  /// <summary>
231  /// Data serializer for Enum.
232  /// </summary>
233  public class EnumSerializer : DataSerializer<Enum>
234  {
235  /// <inheritdoc/>
236  public override void Serialize(ref Enum obj, ArchiveMode mode, SerializationStream stream)
237  {
238  if (mode == ArchiveMode.Serialize)
239  {
240  stream.Write(obj != null ? obj.GetType().AssemblyQualifiedName : string.Empty);
241  stream.Write(Convert.ToInt32(obj));
242  }
243  else if (mode == ArchiveMode.Deserialize)
244  {
245  var type = Type.GetType(stream.ReadString());
246  var value = stream.ReadInt32();
247  if (type != null)
248  obj = (Enum)Enum.ToObject(type, value);
249  }
250  }
251  }
252 
253  /// <summary>
254  /// Data serializer for typed enum.
255  /// </summary>
256  public unsafe class EnumSerializer<T> : DataSerializer<T>, IDataSerializerInitializer where T : struct
257  {
258  private int EnumSize;
259 
260  public void Initialize(SerializerSelector serializerSelector)
261  {
262  // Use Marshal SizeOf to avoid AOT issues on iOS
263  EnumSize = Marshal.SizeOf(Enum.GetUnderlyingType(typeof(T)));
264  }
265 
266  /// <inheritdoc/>
267  public override void Serialize(ref T obj, ArchiveMode mode, SerializationStream stream)
268  {
269  // For now, 1 and 2 bytes enum are stored as 4 bytes for previous binary compatibility.
270  // Future, 2 choices if we decide to drop it and have more compact formats for small enum:
271  // - Dump as-is from/to memory (not so resistant to structure size changes)
272  // - Use 7bit encoded integer
273  switch (EnumSize)
274  {
275  case 1:
276  {
277  var objPtr = (byte*)Interop.Cast(ref obj);
278  uint value = *objPtr;
279  stream.Serialize(ref value);
280  *objPtr = (byte)value;
281  break;
282  }
283  case 2:
284  {
285  var objPtr = (ushort*)Interop.Cast(ref obj);
286  uint value = *objPtr;
287  stream.Serialize(ref value);
288  *objPtr = (ushort)value;
289  break;
290  }
291  case 4:
292  {
293  var objPtr = (uint*)Interop.Cast(ref obj);
294  stream.Serialize(ref *objPtr);
295  break;
296  }
297  case 8:
298  {
299  var objPtr = (ulong*)Interop.Cast(ref obj);
300  stream.Serialize(ref *objPtr);
301  break;
302  }
303  default:
304  throw new InvalidOperationException();
305  }
306  }
307  }
308 
309  /// <summary>
310  /// Data serializer for Guid.
311  /// </summary>
312  [DataSerializerGlobal(typeof(GuidSerializer))]
313  public class GuidSerializer : DataSerializer<Guid>
314  {
315  /// <inheritdoc/>
316  public override bool IsBlittable { get { return true; } }
317 
318  /// <inheritdoc/>
319  public override void Serialize(ref Guid obj, ArchiveMode mode, SerializationStream stream)
320  {
321  if (mode == ArchiveMode.Serialize)
322  {
323  var guidData = obj.ToByteArray();
324  stream.Serialize(guidData, 0, guidData.Length);
325  }
326  else if (mode == ArchiveMode.Deserialize)
327  {
328  var guidData = new byte[16];
329  stream.Serialize(guidData, 0, guidData.Length);
330  obj = new Guid(guidData);
331  }
332  }
333  }
334 
335  /// <summary>
336  /// Data serializer for TimeSpan.
337  /// </summary>
338  [DataSerializerGlobal(typeof(TimeSpanSerializer))]
339  public class TimeSpanSerializer : DataSerializer<TimeSpan>
340  {
341  public override void Serialize(ref TimeSpan timeSpan, ArchiveMode mode, SerializationStream stream)
342  {
343  if (mode == ArchiveMode.Serialize)
344  {
345  stream.Write(timeSpan.Ticks);
346  }
347  else if (mode == ArchiveMode.Deserialize)
348  {
349  timeSpan = new TimeSpan(stream.ReadInt64());
350  }
351  }
352  }
353 
354  [DataSerializerGlobal(typeof(DateTimeSerializer))]
355  public class DateTimeSerializer : DataSerializer<DateTime>
356  {
357  public override void Serialize(ref DateTime dateTime, ArchiveMode mode, SerializationStream stream)
358  {
359  if (mode == ArchiveMode.Serialize)
360  {
361  stream.Write(dateTime.Ticks);
362  }
363  else if (mode == ArchiveMode.Deserialize)
364  {
365  dateTime = new DateTime(stream.ReadInt64());
366  }
367  }
368  }
369 }
override void Serialize(ref ushort obj, ArchiveMode mode, SerializationStream stream)
override void Serialize(ref float obj, ArchiveMode mode, SerializationStream stream)
void Initialize(SerializerSelector serializerSelector)
Initializes the specified serializer.
override void Serialize(ref byte obj, ArchiveMode mode, SerializationStream stream)
override void Serialize(ref uint obj, ArchiveMode mode, SerializationStream stream)
override void Serialize(ref long obj, ArchiveMode mode, SerializationStream stream)
override void Serialize(ref double obj, ArchiveMode mode, SerializationStream stream)
override void Serialize(ref ulong obj, ArchiveMode mode, SerializationStream stream)
Base class for implementation of SerializationStream.
override void Serialize(ref bool obj, ArchiveMode mode, SerializationStream stream)
override void Serialize(ref T obj, ArchiveMode mode, SerializationStream stream)
Adds initialization feature to a DataSerializer.
override void Serialize(ref System.Uri obj, ArchiveMode mode, SerializationStream stream)
override void Serialize(ref sbyte obj, ArchiveMode mode, SerializationStream stream)
override void Serialize(ref short obj, ArchiveMode mode, SerializationStream stream)
Serializer context. It holds DataSerializer{T} objects and their factories.
override void Serialize(ref string obj, ArchiveMode mode, SerializationStream stream)
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).
Definition: ArchiveMode.cs:8
Android.Net.Uri Uri
Definition: HtmlElement.cs:8
override void Serialize(ref char obj, ArchiveMode mode, SerializationStream stream)
override void Serialize(ref int obj, ArchiveMode mode, SerializationStream stream)
override void Serialize(ref Enum obj, ArchiveMode mode, SerializationStream stream)
override void Serialize(ref DateTime dateTime, ArchiveMode mode, SerializationStream stream)
override void Serialize(ref TimeSpan timeSpan, ArchiveMode mode, SerializationStream stream)
override void Serialize(ref Guid obj, ArchiveMode mode, SerializationStream stream)