public virtual DataContractSerializer GetDataContractSerializer(Type serializingType, Type typeToSerialize, string xmlName, string rootNamespace = null, List<Type> additionalKnownTypes = null)
{
Argument.IsNotNull("serializingType", serializingType);
Argument.IsNotNull("typeToSerialize", typeToSerialize);
Argument.IsNotNullOrWhitespace("xmlName", xmlName);
var typeToSerializeName = typeToSerialize.GetSafeFullName(false);
var key = string.Format("{0}|{1}", typeToSerializeName, xmlName);
return _dataContractSerializersCache.GetFromCacheOrFetch(key, () =>
{
#if ENABLE_DETAILED_LOGGING
Log.Debug("Getting known types for xml serialization of '{0}'", typeToSerializeName);
#endif
var serializerTypeInfo = new XmlSerializerTypeInfo(serializingType, typeToSerialize, additionalKnownTypes);
GetKnownTypes(typeToSerialize, serializerTypeInfo);
var knownTypesViaAttributes = GetKnownTypesViaAttributes(serializingType);
foreach (var knownTypeViaAttribute in knownTypesViaAttributes)
{
GetKnownTypes(knownTypeViaAttribute, serializerTypeInfo);
}
if (additionalKnownTypes != null)
{
foreach (var additionalKnownType in additionalKnownTypes)
{
GetKnownTypes(additionalKnownType, serializerTypeInfo);
}
}
var xmlSerializer = new DataContractSerializer(typeToSerialize, xmlName, rootNamespace ?? string.Empty, serializerTypeInfo.KnownTypes);
return xmlSerializer;
});
}
#endregion