4 using System.Collections.Generic;
6 using System.Reflection;
8 using SharpYaml.Serialization;
9 using SiliconStudio.Core.Reflection;
12 namespace SiliconStudio.Core.Yaml
20 private static readonly HashSet<Assembly> RegisteredAssemblies =
new HashSet<Assembly>();
21 private static readonly
object Lock =
new object();
22 private static Serializer globalSerializer;
23 private static Serializer globalSerializerKeepOnlySealedOverrides;
32 var serializer = GetYamlSerializer(
false);
33 return serializer.Deserialize(stream);
42 public static void Serialize(
Stream stream,
object instance,
bool keepOnlySealedOverrides =
false)
44 var serializer = GetYamlSerializer(keepOnlySealedOverrides);
45 serializer.Serialize(stream, instance);
50 return GetYamlSerializer(
false).Settings;
53 private static Serializer GetYamlSerializer(
bool keepOnlySealedOverrides)
55 Serializer localSerializer;
59 localSerializer = keepOnlySealedOverrides ? CreateSerializer(
true, ref globalSerializerKeepOnlySealedOverrides) : CreateSerializer(
false, ref globalSerializer);
61 return localSerializer;
64 private static Serializer CreateSerializer(
bool keepOnlySealedOverrides, ref Serializer localSerializer)
66 if (localSerializer == null)
68 var config =
new SerializerSettings()
71 LimitPrimitiveFlowSequence = 0,
72 Attributes =
new AtributeRegistryFilter(),
76 foreach (var registeredAssembly
in RegisteredAssemblies)
78 config.RegisterAssembly(registeredAssembly);
81 localSerializer =
new Serializer(config);
82 localSerializer.Settings.ObjectSerializerBackend =
new OverrideKeyMappingTransform(
TypeDescriptorFactory.
Default, keepOnlySealedOverrides);
85 return localSerializer;
93 public override List<Attribute> GetAttributes(
System.Reflection.MemberInfo memberInfo,
bool inherit =
true)
95 var attributes = base.GetAttributes(memberInfo, inherit);
96 for (
int i = attributes.Count - 1; i >= 0; i--)
98 var attribute = attributes[i] as DataMemberAttribute;
99 if (attribute != null)
101 attributes[i] =
new YamlMemberAttribute(attribute.Name) { Order = attribute.Order };
103 else if (attributes[i] is DataMemberIgnoreAttribute)
105 attributes[i] =
new YamlIgnoreAttribute();
107 else if (attributes[i] is DataContractAttribute)
109 var alias = ((DataContractAttribute)attributes[i]).Alias;
110 if (!
string.IsNullOrWhiteSpace(alias))
112 attributes[i] =
new YamlTagAttribute(alias);
115 else if (attributes[i] is DataStyleAttribute)
117 switch (((DataStyleAttribute)attributes[i]).Style)
120 attributes[i] =
new YamlStyleAttribute(YamlStyle.Any);
122 case DataStyle.Compact:
123 attributes[i] =
new YamlStyleAttribute(YamlStyle.Flow);
125 case DataStyle.Normal:
126 attributes[i] =
new YamlStyleAttribute(YamlStyle.Block);
136 internal static void Initialize()
138 AssemblyRegistry.AssemblyRegistered += AssemblyRegistry_AssemblyRegistered;
141 RegisteredAssemblies.Add(assembly);
149 RegisteredAssemblies.Add(e.Assembly);
152 globalSerializer = null;
153 globalSerializerKeepOnlySealedOverrides = null;
SharpYaml.Serialization.AttributeRegistry AttributeRegistry
A default implementation for the ITypeDescriptorFactory.
static HashSet< Assembly > FindAll()
Finds all registered assemblies.
Default Yaml serializer used to serialize assets by default.
Provides a basic infrastructure to associate an assembly with some categories and to query and regist...
An event occuring when an assembly is registered with AssemblyRegistry.
static SerializerSettings GetSerializerSettings()
static object Deserialize(Stream stream)
Deserializes an object from the specified stream (expecting a YAML string).
static void Serialize(Stream stream, object instance, bool keepOnlySealedOverrides=false)
Serializes an object to specified stream in YAML format.
A default implementation for IAttributeRegistry. This implementation allows to retrieve default attri...
static readonly TypeDescriptorFactory Default
The default type descriptor factory.