XmlSerializerFactory.cs 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. //------------------------------------------------------------------------------
  2. // <copyright file="XmlSerializer.cs" company="Microsoft">
  3. // Copyright (c) Microsoft Corporation. All rights reserved.
  4. // </copyright>
  5. // <owner current="true" primary="true">Microsoft</owner>
  6. //------------------------------------------------------------------------------
  7. namespace System.Xml.Serialization {
  8. using System.Reflection;
  9. using System.Collections;
  10. using System.IO;
  11. using System.Xml.Schema;
  12. using System;
  13. using System.Text;
  14. using System.Threading;
  15. using System.Globalization;
  16. using System.Security.Permissions;
  17. using System.Security.Policy;
  18. using System.Xml.Serialization.Configuration;
  19. using System.Diagnostics;
  20. using System.CodeDom.Compiler;
  21. /// <include file='doc\XmlSerializerFactory.uex' path='docs/doc[@for="XmlSerializerFactory"]/*' />
  22. /// <devdoc>
  23. /// <para>[To be supplied.]</para>
  24. /// </devdoc>
  25. public class XmlSerializerFactory {
  26. static TempAssemblyCache cache = new TempAssemblyCache();
  27. /// <include file='doc\XmlSerializerFactory.uex' path='docs/doc[@for="XmlSerializerFactory.CreateSerializer"]/*' />
  28. /// <devdoc>
  29. /// <para>[To be supplied.]</para>
  30. /// </devdoc>
  31. public XmlSerializer CreateSerializer(Type type, XmlAttributeOverrides overrides, Type[] extraTypes, XmlRootAttribute root, string defaultNamespace) {
  32. return CreateSerializer(type, overrides, extraTypes, root, defaultNamespace, null);
  33. }
  34. /// <include file='doc\XmlSerializerFactory.uex' path='docs/doc[@for="XmlSerializerFactory.CreateSerializer2"]/*' />
  35. /// <devdoc>
  36. /// <para>[To be supplied.]</para>
  37. /// </devdoc>
  38. public XmlSerializer CreateSerializer(Type type, XmlRootAttribute root) {
  39. return CreateSerializer(type, null, new Type[0], root, null, null);
  40. }
  41. /// <include file='doc\XmlSerializerFactory.uex' path='docs/doc[@for="XmlSerializerFactory.CreateSerializer3"]/*' />
  42. /// <devdoc>
  43. /// <para>[To be supplied.]</para>
  44. /// </devdoc>
  45. public XmlSerializer CreateSerializer(Type type, Type[] extraTypes) {
  46. return CreateSerializer(type, null, extraTypes, null, null, null);
  47. }
  48. /// <include file='doc\XmlSerializerFactory.uex' path='docs/doc[@for="XmlSerializerFactory.CreateSerializer4"]/*' />
  49. /// <devdoc>
  50. /// <para>[To be supplied.]</para>
  51. /// </devdoc>
  52. public XmlSerializer CreateSerializer(Type type, XmlAttributeOverrides overrides) {
  53. return CreateSerializer(type, overrides, new Type[0], null, null, null);
  54. }
  55. /// <include file='doc\XmlSerializerFactory.uex' path='docs/doc[@for="XmlSerializerFactory.CreateSerializer5"]/*' />
  56. /// <devdoc>
  57. /// <para>[To be supplied.]</para>
  58. /// </devdoc>
  59. public XmlSerializer CreateSerializer(XmlTypeMapping xmlTypeMapping) {
  60. TempAssembly tempAssembly = XmlSerializer.GenerateTempAssembly(xmlTypeMapping);
  61. return (XmlSerializer)tempAssembly.Contract.TypedSerializers[xmlTypeMapping.Key];
  62. }
  63. /// <include file='doc\XmlSerializerFactory.uex' path='docs/doc[@for="XmlSerializerFactory.CreateSerializer6"]/*' />
  64. /// <devdoc>
  65. /// <para>[To be supplied.]</para>
  66. /// </devdoc>
  67. public XmlSerializer CreateSerializer(Type type) {
  68. return CreateSerializer(type, (string)null);
  69. }
  70. /// <include file='doc\XmlSerializerFactory.uex' path='docs/doc[@for="XmlSerializerFactory.CreateSerializer1"]/*' />
  71. /// <devdoc>
  72. /// <para>[To be supplied.]</para>
  73. /// </devdoc>
  74. public XmlSerializer CreateSerializer(Type type, string defaultNamespace) {
  75. if (type == null)
  76. throw new ArgumentNullException("type");
  77. TempAssembly tempAssembly = cache[defaultNamespace, type];
  78. XmlTypeMapping mapping = null;
  79. if (tempAssembly == null) {
  80. lock (cache) {
  81. tempAssembly = cache[defaultNamespace, type];
  82. if (tempAssembly == null) {
  83. XmlSerializerImplementation contract;
  84. Assembly assembly = TempAssembly.LoadGeneratedAssembly(type, defaultNamespace, out contract);
  85. if (assembly == null) {
  86. // need to reflect and generate new serialization assembly
  87. XmlReflectionImporter importer = new XmlReflectionImporter(defaultNamespace);
  88. mapping = importer.ImportTypeMapping(type, null, defaultNamespace);
  89. tempAssembly = XmlSerializer.GenerateTempAssembly(mapping, type, defaultNamespace);
  90. }
  91. else {
  92. tempAssembly = new TempAssembly(contract);
  93. }
  94. cache.Add(defaultNamespace, type, tempAssembly);
  95. }
  96. }
  97. }
  98. if (mapping == null) {
  99. mapping = XmlReflectionImporter.GetTopLevelMapping(type, defaultNamespace);
  100. }
  101. return (XmlSerializer)tempAssembly.Contract.GetSerializer(type);
  102. }
  103. public XmlSerializer CreateSerializer(Type type, XmlAttributeOverrides overrides, Type[] extraTypes, XmlRootAttribute root, string defaultNamespace, string location) {
  104. #pragma warning disable 618 // Passing through null evidence to centralize the CreateSerializer implementation
  105. return CreateSerializer(type, overrides, extraTypes, root, defaultNamespace, location, null);
  106. #pragma warning restore 618
  107. }
  108. /// <include file='doc\XmlSerializerFactory.uex' path='docs/doc[@for="XmlSerializerFactory.CreateSerializer7"]/*' />
  109. /// <devdoc>
  110. /// <para>[To be supplied.]</para>
  111. /// </devdoc>
  112. [Obsolete("This method is obsolete and will be removed in a future release of the .NET Framework. Please use an overload of CreateSerializer which does not take an Evidence parameter. See http://go2.microsoft.com/fwlink/?LinkId=131738 for more information.")]
  113. public XmlSerializer CreateSerializer(Type type, XmlAttributeOverrides overrides, Type[] extraTypes, XmlRootAttribute root, string defaultNamespace, string location, Evidence evidence) {
  114. if (type == null) {
  115. throw new ArgumentNullException("type");
  116. }
  117. if (location != null || evidence != null) {
  118. DemandForUserLocationOrEvidence();
  119. }
  120. XmlReflectionImporter importer = new XmlReflectionImporter(overrides, defaultNamespace);
  121. for (int i = 0; i < extraTypes.Length; i++)
  122. importer.IncludeType(extraTypes[i]);
  123. XmlTypeMapping mapping = importer.ImportTypeMapping(type, root, defaultNamespace);
  124. TempAssembly tempAssembly = XmlSerializer.GenerateTempAssembly(mapping, type, defaultNamespace, location, evidence);
  125. return (XmlSerializer)tempAssembly.Contract.TypedSerializers[mapping.Key];
  126. }
  127. [PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
  128. void DemandForUserLocationOrEvidence() {
  129. // Ensure full trust before asserting full file access to the user-provided location or evidence
  130. }
  131. }
  132. }