diff --git a/src/Common/tests/System/Runtime/Serialization/Utils.cs b/src/Common/tests/System/Runtime/Serialization/Utils.cs index 6861cb0360e8..4e314d01fd05 100644 --- a/src/Common/tests/System/Runtime/Serialization/Utils.cs +++ b/src/Common/tests/System/Runtime/Serialization/Utils.cs @@ -3,7 +3,7 @@ // See the LICENSE file in the project root for more information. using System; -using System.Collections.Generic; +using System.Collections.Concurrent; using System.Diagnostics; using System.IO; using System.Text; @@ -35,8 +35,8 @@ internal static void Equal(T[] x, T[] y, Func f) } } - private static Dictionary s_prefixToNamespaceDesk = new Dictionary(); - private static Dictionary s_prefixToNamespaceCoreCLR = new Dictionary(); + private static ConcurrentDictionary s_prefixToNamespaceDesk = new ConcurrentDictionary(); + private static ConcurrentDictionary s_prefixToNamespaceCoreCLR = new ConcurrentDictionary(); internal struct CompareResult { diff --git a/src/System.Private.DataContractSerialization/src/System/Runtime/Serialization/ExtensionDataReader.cs b/src/System.Private.DataContractSerialization/src/System/Runtime/Serialization/ExtensionDataReader.cs index 62af8d097107..011b2bc35211 100644 --- a/src/System.Private.DataContractSerialization/src/System/Runtime/Serialization/ExtensionDataReader.cs +++ b/src/System.Private.DataContractSerialization/src/System/Runtime/Serialization/ExtensionDataReader.cs @@ -3,7 +3,7 @@ // See the LICENSE file in the project root for more information. using System.Xml; -using System.Collections.Generic; +using System.Collections; namespace System.Runtime.Serialization { @@ -37,20 +37,22 @@ private enum ExtensionDataNodeType private int _attributeCount; private int _attributeIndex; + private static object s_prefixLock = new object(); + #pragma warning disable 0649 private XmlNodeReader _xmlNodeReader; #pragma warning restore 0649 private XmlObjectSerializerReadContext _context; - private static Dictionary s_nsToPrefixTable; + private static Hashtable s_nsToPrefixTable; - private static Dictionary s_prefixToNsTable; + private static Hashtable s_prefixToNsTable; static ExtensionDataReader() { - s_nsToPrefixTable = new Dictionary(); - s_prefixToNsTable = new Dictionary(); + s_nsToPrefixTable = new Hashtable(); + s_prefixToNsTable = new Hashtable(); AddPrefix(Globals.XsiPrefix, Globals.SchemaInstanceNamespace); AddPrefix(Globals.SerPrefix, Globals.SerializationNamespace); AddPrefix(string.Empty, string.Empty); @@ -205,10 +207,7 @@ public override string LookupNamespace(string prefix) if (IsXmlDataNode) return _xmlNodeReader.LookupNamespace(prefix); - string ns; - if (!s_prefixToNsTable.TryGetValue(prefix, out ns)) - return null; - return ns; + return (string)s_prefixToNsTable[prefix]; } public override void Skip() @@ -482,13 +481,14 @@ private ElementData GetNextElement() internal static string GetPrefix(string ns) { - string prefix; ns = ns ?? string.Empty; - if (!s_nsToPrefixTable.TryGetValue(ns, out prefix)) + string prefix = (string)s_nsToPrefixTable[ns]; + if (prefix == null) { - lock (s_nsToPrefixTable) + lock (s_prefixLock) { - if (!s_nsToPrefixTable.TryGetValue(ns, out prefix)) + prefix = (string)s_nsToPrefixTable[ns]; + if (prefix == null) { prefix = (ns == null || ns.Length == 0) ? string.Empty : "p" + s_nsToPrefixTable.Count; AddPrefix(prefix, ns); diff --git a/src/System.Runtime.Serialization.Xml/tests/SerializationTestTypes/DataContractResolverLibrary.cs b/src/System.Runtime.Serialization.Xml/tests/SerializationTestTypes/DataContractResolverLibrary.cs index a3cba3554457..720b9d86fc26 100644 --- a/src/System.Runtime.Serialization.Xml/tests/SerializationTestTypes/DataContractResolverLibrary.cs +++ b/src/System.Runtime.Serialization.Xml/tests/SerializationTestTypes/DataContractResolverLibrary.cs @@ -3,7 +3,7 @@ // See the LICENSE file in the project root for more information. using System; -using System.Collections.Generic; +using System.Collections.Concurrent; using System.Runtime.Serialization; using System.Xml; @@ -13,7 +13,7 @@ namespace SerializationTestTypes public class PrimitiveTypeResolver : DataContractResolver { private readonly static string s_defaultNS = "http://www.default.com"; - private readonly static Dictionary s_types = new Dictionary(); + private readonly static ConcurrentDictionary s_types = new ConcurrentDictionary(); public override bool TryResolveType(Type dcType, Type declaredType, DataContractResolver KTResolver, out XmlDictionaryString typeName, out XmlDictionaryString typeNamespace) {