Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
MemberSerializer.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.Linq;
5 using System.Collections.Generic;
6 using System.Reflection;
7 using SiliconStudio.Core.Reflection;
8 
9 namespace SiliconStudio.Core.Serialization
10 {
12  {
13  public static readonly Dictionary<string, Type> CachedTypes = new Dictionary<string, Type>();
14  public static readonly Dictionary<Type, string> ReverseCachedTypes = new Dictionary<Type, string>();
15 
16  // Holds object references during serialization, useful when same object is referenced multiple time in same serialization graph.
17  internal static PropertyKey<Dictionary<object, int>> ObjectSerializeReferences = new PropertyKey<Dictionary<object, int>>("ObjectSerializeReferences", typeof(SerializerExtensions),
18  DefaultValueMetadata.Delegate(
19  delegate
20  {
21  return new Dictionary<object, int>(ObjectReferenceEqualityComparer.Default);
22  }));
23  internal static PropertyKey<List<object>> ObjectDeserializeReferences = new PropertyKey<List<object>>("ObjectDeserializeReferences", typeof(SerializerExtensions), DefaultValueMetadata.Delegate(delegate { return new List<object>(); }));
24 
25  /// <summary>
26  /// Implements an equality comparer based on object reference instead of <see cref="object.Equals(object)"/>.
27  /// </summary>
28  private class ObjectReferenceEqualityComparer : EqualityComparer<object>
29  {
30  private static IEqualityComparer<object> defaultEqualityComparer;
31 
32  public new static IEqualityComparer<object> Default
33  {
34  get { return defaultEqualityComparer ?? (defaultEqualityComparer = new ObjectReferenceEqualityComparer()); }
35  }
36 
37  public override bool Equals(object x, object y)
38  {
39  return ReferenceEquals(x, y);
40  }
41 
42  public override int GetHashCode(object obj)
43  {
44  return System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode(obj);
45  }
46  }
47  }
48 
49  /// <summary>
50  /// Helper for serializing members of a class.
51  /// </summary>
52  /// <typeparam name="T">The type of member to serialize.</typeparam>
53  public abstract class MemberSerializer<T> : DataSerializer<T>
54  {
55  protected static bool isValueType = typeof(T).GetTypeInfo().IsValueType;
56 
57  // For now we hardcode here that Type subtypes should be ignored, but this should probably be a DataSerializerAttribute flag?
58  protected static bool isSealed = typeof(T).GetTypeInfo().IsSealed || typeof(T) == typeof(Type);
59 
61 
62  public MemberSerializer(DataSerializer<T> dataSerializer)
63  {
64  this.dataSerializer = dataSerializer;
65  }
66 
67  public static DataSerializer<T> Create(SerializerSelector serializerSelector, bool nullable = true)
68  {
69  var dataSerializer = serializerSelector.GetSerializer<T>();
70  if (!isValueType)
71  {
72  if (serializerSelector.ReuseReferences)
73  dataSerializer = typeof(T) == typeof(object) ? (DataSerializer<T>)new MemberReuseSerializerObject<T>(dataSerializer) : new MemberReuseSerializer<T>(dataSerializer);
74  else if (!isSealed)
75  dataSerializer = typeof(T) == typeof(object) ? (DataSerializer<T>)new MemberNonSealedSerializerObject<T>(dataSerializer) : new MemberNonSealedSerializer<T>(dataSerializer);
76  else if (nullable)
77  dataSerializer = new MemberNullableSerializer<T>(dataSerializer);
78  }
79 
80  return dataSerializer;
81  }
82  }
83 }
_In_ size_t _In_ DXGI_FORMAT _In_ size_t _In_ float size_t y
Definition: DirectXTexP.h:191
Various useful extension methods on top of SerializationStream for serialization/deserialization of c...
Use the default mode depending on the type of the field/property.
Serializer context. It holds DataSerializer{T} objects and their factories.
bool ReuseReferences
Gets or sets a value indicating whether [serialization reuses references] (that is, each reference gets assigned an ID and if it is serialized again, same instance will be reused).
Describes how to serialize and deserialize an object without knowing its type. Used as a common base ...
static DataSerializer< T > Create(SerializerSelector serializerSelector, bool nullable=true)
Describes how to serialize and deserialize an object of a given type.
A class that represents a tag propety.
Definition: PropertyKey.cs:17
MemberSerializer(DataSerializer< T > dataSerializer)