Преглед на файлове

TARGET_JVM: save additional types per AppDomain

svn path=/trunk/mcs/; revision=53986
Konstantin Triger преди 20 години
родител
ревизия
bf50affc18
променени са 2 файла, в които са добавени 35 реда и са изтрити 0 реда
  1. 4 0
      mcs/class/System.XML/System.Xml.Serialization/ChangeLog
  2. 31 0
      mcs/class/System.XML/System.Xml.Serialization/TypeTranslator.cs

+ 4 - 0
mcs/class/System.XML/System.Xml.Serialization/ChangeLog

@@ -1,3 +1,7 @@
+2005-12-06  Konstantin Triger  <[email protected]>
+
+	* TypeTranslator.cs: TARGET_JVM: save additional types per AppDomain.
+
 2005-12-05  Lluis Sanchez Gual  <[email protected]>
 
 	* XmlSerializationReaderInterpreter.cs:

+ 31 - 0
mcs/class/System.XML/System.Xml.Serialization/TypeTranslator.cs

@@ -44,6 +44,27 @@ namespace System.Xml.Serialization
 		static Hashtable primitiveTypes;
 		static Hashtable primitiveArrayTypes;
 
+#if TARGET_JVM
+		const string AppDomainCacheName = "System.Xml.Serialization.TypeTranslator.AppDomainCache";
+		static Hashtable AppDomainCache {
+			get {
+				Hashtable res = (Hashtable)AppDomain.CurrentDomain.GetData(AppDomainCacheName);
+
+				if(res == null) {
+					lock(AppDomainCacheName) {
+						res = (Hashtable)AppDomain.CurrentDomain.GetData(AppDomainCacheName);
+						if (res == null) {
+							res = new Hashtable();
+							AppDomain.CurrentDomain.SetData(AppDomainCacheName, res);
+						}
+					}
+				}
+
+				return res;
+			}
+		}
+#endif
+
 		static TypeTranslator ()
 		{
 			nameCache = new Hashtable ();
@@ -146,6 +167,12 @@ namespace System.Xml.Serialization
 			lock (nameCache) {
 				TypeData typeData = nameCache[type] as TypeData;
 				if (typeData != null) return typeData;
+
+#if TARGET_JVM
+				Hashtable dynamicCache = AppDomainCache;
+				typeData = dynamicCache[type] as TypeData;
+				if (typeData != null) return typeData;
+#endif
 				
 				string name;
 				if (type.IsArray) {
@@ -156,7 +183,11 @@ namespace System.Xml.Serialization
 					name = XmlConvert.EncodeLocalName (type.Name);
 
 				typeData = new TypeData (type, name, false);
+#if TARGET_JVM
+				dynamicCache[type] = typeData;
+#else
 				nameCache[type] = typeData;
+#endif
 				return typeData;
 			}
 		}