Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
ParameterCollectionData.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.Collections.Generic;
4 using System.Reflection;
5 using SiliconStudio.Core.Serialization;
6 using SiliconStudio.Core.Serialization.Converters;
7 using SiliconStudio.Core.Serialization.Serializers;
8 #if SILICONSTUDIO_PLATFORM_WINDOWS_RUNTIME
9 // TODO: Need to review whether our SortedList is as fast as .NET one before switching it for everybody
10 using SiliconStudio.Core.Collections;
11 #endif
12 
13 namespace SiliconStudio.Paradox.Effects.Data
14 {
15  [DataSerializer(typeof(ParameterCollectionData.Serializer))]
16  public partial class ParameterCollectionData : SortedList<ParameterKey, object>
17  {
19  {
20  }
21 
22  public void Set(ParameterKey key, object value)
23  {
24  var indexOfKey = this.IndexOfKey(key);
25  if (indexOfKey >= 0)
26  {
27  this[key] = value;
28  return;
29  }
30 
31  Add(key, value);
32  }
33 
34  internal class Serializer : DataSerializer<ParameterCollectionData>, IDataSerializerInitializer
35  {
36  private bool reuseReferences;
37 
38  public void Initialize(SerializerSelector serializerSelector)
39  {
40  reuseReferences = serializerSelector.ReuseReferences;
41  }
42 
43  public override void PreSerialize(ref ParameterCollectionData obj, ArchiveMode mode, SerializationStream stream)
44  {
45  if (mode == ArchiveMode.Deserialize)
46  {
47  // TODO: Peek the dictionary size
48  if (obj == null)
49  obj = new ParameterCollectionData();
50  else
51  obj.Clear();
52  }
53  }
54 
55  public override void Serialize(ref ParameterCollectionData obj, ArchiveMode mode, SerializationStream stream)
56  {
57  if (mode == ArchiveMode.Deserialize)
58  {
59  // Should be null if it was
60  int count = stream.ReadInt32();
61  for (int i = 0; i < count; ++i)
62  {
63  ParameterKey key = null;
64  object value = null;
65  bool matchingType = false;
66 
67  stream.SerializeExtended(ref key, mode);
68  stream.Serialize(ref matchingType);
69 
70  var valueType = matchingType ? key.PropertyType : typeof(object);
71  if (reuseReferences)
72  MemberReuseSerializer.SerializeExtended(stream, valueType, ref value, mode);
73  else
74  MemberNonSealedSerializer.SerializeExtended(stream, valueType, ref value, mode);
75 
76  obj.Add(key, value);
77  }
78  }
79  else if (mode == ArchiveMode.Serialize)
80  {
81  stream.Write(obj.Count);
82  foreach (var item in obj)
83  {
84  var key = item.Key;
85 
86  // When serializing convert the value type to the expecting type
87  // This should probably better done at the source (when creating/filling the ParameterCollectionData)
88  var value = item.Key.ConvertValue(item.Value);
89 
90  stream.SerializeExtended(ref key, mode);
91  bool matchingType = value.GetType().GetTypeInfo().IsAssignableFrom(key.PropertyType.GetTypeInfo());
92  stream.Serialize(ref matchingType);
93 
94  var valueType = matchingType ? key.PropertyType : typeof(object);
95 
96  if (reuseReferences)
97  MemberReuseSerializer.SerializeExtended(stream, valueType, ref value, mode);
98  else
99  MemberNonSealedSerializer.SerializeExtended(stream, valueType, ref value, mode);
100  }
101  }
102  }
103  }
104  }
105 
106  public partial class ParameterCollectionDataConverter : DataConverter<ParameterCollectionData, ParameterCollection>
107  {
108  public override void ConvertToData(ConverterContext converterContext, ref ParameterCollectionData parameterCollectionData, ParameterCollection parameterCollection)
109  {
110  parameterCollectionData = new ParameterCollectionData();
111  foreach (var parameter in parameterCollection.InternalValues)
112  {
113  if (parameterCollection.IsValueOwner(parameter.Value))
114  parameterCollectionData.Add(parameter.Key, parameter.Value.Object);
115  }
116  }
117 
118  public override void ConvertFromData(ConverterContext converterContext, ParameterCollectionData parameterCollectionData, ref ParameterCollection parameterCollection)
119  {
120  parameterCollection = new ParameterCollection("Deserialized collection");
121  foreach (var parameter in parameterCollectionData)
122  {
123  var parameterValue = parameter.Value;
124  if (parameterValue is ContentReference)
125  parameterValue = converterContext.ConvertFromData<object>(parameterValue);
126  parameterCollection.SetObject(parameter.Key, parameterValue);
127  }
128  }
129  }
130 }
Key of an effect parameter.
Definition: ParameterKey.cs:15
Base class for converters to/from a data type.
Data type for SiliconStudio.Paradox.Effects.ParameterCollection.
Definition: ParadoxData.cs:31
_In_ size_t count
Definition: DirectXTexP.h:174
Base class for implementation of SerializationStream.
Adds initialization feature to a DataSerializer.
override void ConvertToData(ConverterContext converterContext, ref ParameterCollectionData parameterCollectionData, ParameterCollection parameterCollection)
Serializer context. It holds DataSerializer{T} objects and their factories.
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
override void ConvertFromData(ConverterContext converterContext, ParameterCollectionData parameterCollectionData, ref ParameterCollection parameterCollection)
A container to handle a hierarchical collection of effect variables.