Updates referencesource to .NET 4.7
[mono.git] / mcs / class / referencesource / System.Xml / System / Xml / Serialization / XmlSerializerFactory.cs
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
8 namespace System.Xml.Serialization {
9
10     using System.Reflection;
11     using System.Collections;
12     using System.IO;
13     using System.Xml.Schema;
14     using System;
15     using System.Text;
16     using System.Threading;
17     using System.Globalization;
18     using System.Security.Permissions;
19     using System.Security.Policy;
20     using System.Xml.Serialization.Configuration;
21     using System.Diagnostics;
22     using System.CodeDom.Compiler;
23
24
25     /// <include file='doc\XmlSerializerFactory.uex' path='docs/doc[@for="XmlSerializerFactory"]/*' />
26     /// <devdoc>
27     ///    <para>[To be supplied.]</para>
28     /// </devdoc>
29     public class XmlSerializerFactory {
30         static TempAssemblyCache cache = new TempAssemblyCache();
31
32         /// <include file='doc\XmlSerializerFactory.uex' path='docs/doc[@for="XmlSerializerFactory.CreateSerializer"]/*' />
33         /// <devdoc>
34         ///    <para>[To be supplied.]</para>
35         /// </devdoc>
36         public XmlSerializer CreateSerializer(Type type, XmlAttributeOverrides overrides, Type[] extraTypes, XmlRootAttribute root, string defaultNamespace) {
37             return CreateSerializer(type, overrides, extraTypes, root, defaultNamespace, null);
38         }
39
40         /// <include file='doc\XmlSerializerFactory.uex' path='docs/doc[@for="XmlSerializerFactory.CreateSerializer2"]/*' />
41         /// <devdoc>
42         ///    <para>[To be supplied.]</para>
43         /// </devdoc>
44         public XmlSerializer CreateSerializer(Type type, XmlRootAttribute root) {
45             return CreateSerializer(type, null, new Type[0], root, null, null);
46         }
47
48         /// <include file='doc\XmlSerializerFactory.uex' path='docs/doc[@for="XmlSerializerFactory.CreateSerializer3"]/*' />
49         /// <devdoc>
50         ///    <para>[To be supplied.]</para>
51         /// </devdoc>
52         public XmlSerializer CreateSerializer(Type type, Type[] extraTypes) {
53             return CreateSerializer(type, null, extraTypes, null, null, null);
54         }
55
56         /// <include file='doc\XmlSerializerFactory.uex' path='docs/doc[@for="XmlSerializerFactory.CreateSerializer4"]/*' />
57         /// <devdoc>
58         ///    <para>[To be supplied.]</para>
59         /// </devdoc>
60         public XmlSerializer CreateSerializer(Type type, XmlAttributeOverrides overrides) {
61             return CreateSerializer(type, overrides, new Type[0], null, null, null);
62         }
63
64         /// <include file='doc\XmlSerializerFactory.uex' path='docs/doc[@for="XmlSerializerFactory.CreateSerializer5"]/*' />
65         /// <devdoc>
66         ///    <para>[To be supplied.]</para>
67         /// </devdoc>
68         public XmlSerializer CreateSerializer(XmlTypeMapping xmlTypeMapping) {
69             TempAssembly tempAssembly = XmlSerializer.GenerateTempAssembly(xmlTypeMapping);
70             return (XmlSerializer)tempAssembly.Contract.TypedSerializers[xmlTypeMapping.Key];
71         }
72
73         /// <include file='doc\XmlSerializerFactory.uex' path='docs/doc[@for="XmlSerializerFactory.CreateSerializer6"]/*' />
74         /// <devdoc>
75         ///    <para>[To be supplied.]</para>
76         /// </devdoc>
77         public XmlSerializer CreateSerializer(Type type) {
78             return CreateSerializer(type, (string)null);
79         }
80
81         /// <include file='doc\XmlSerializerFactory.uex' path='docs/doc[@for="XmlSerializerFactory.CreateSerializer1"]/*' />
82         /// <devdoc>
83         ///    <para>[To be supplied.]</para>
84         /// </devdoc>
85         public XmlSerializer CreateSerializer(Type type, string defaultNamespace) {
86             if (type == null)
87                 throw new ArgumentNullException("type");
88             TempAssembly tempAssembly = cache[defaultNamespace, type];
89             XmlTypeMapping mapping = null;
90             if (tempAssembly == null) {
91                 lock (cache) {
92                     tempAssembly = cache[defaultNamespace, type];
93                     if (tempAssembly == null) {
94                         XmlSerializerImplementation contract;
95                         Assembly assembly = TempAssembly.LoadGeneratedAssembly(type, defaultNamespace, out contract);
96                         if (assembly == null) {
97                             // need to reflect and generate new serialization assembly
98                             XmlReflectionImporter importer = new XmlReflectionImporter(defaultNamespace);
99                             mapping = importer.ImportTypeMapping(type, null, defaultNamespace);
100                             tempAssembly = XmlSerializer.GenerateTempAssembly(mapping, type, defaultNamespace);
101                         }
102                         else {
103                             tempAssembly = new TempAssembly(contract);
104                         }
105                         cache.Add(defaultNamespace, type, tempAssembly);
106                     }
107                 }
108             }
109             if (mapping == null) {
110                 mapping = XmlReflectionImporter.GetTopLevelMapping(type, defaultNamespace);
111             }
112             return (XmlSerializer)tempAssembly.Contract.GetSerializer(type);
113         }
114
115         public XmlSerializer CreateSerializer(Type type, XmlAttributeOverrides overrides, Type[] extraTypes, XmlRootAttribute root, string defaultNamespace, string location) {
116 #pragma warning disable 618 // Passing through null evidence to centralize the CreateSerializer implementation
117             return CreateSerializer(type, overrides, extraTypes, root, defaultNamespace, location, null);
118 #pragma warning restore 618
119         }
120
121         /// <include file='doc\XmlSerializerFactory.uex' path='docs/doc[@for="XmlSerializerFactory.CreateSerializer7"]/*' />
122         /// <devdoc>
123         ///    <para>[To be supplied.]</para>
124         /// </devdoc>
125         [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.")]
126         public XmlSerializer CreateSerializer(Type type, XmlAttributeOverrides overrides, Type[] extraTypes, XmlRootAttribute root, string defaultNamespace, string location, Evidence evidence) {
127             if (type == null) {
128                 throw new ArgumentNullException("type");
129             }
130
131             if (location != null || evidence != null) {
132                 DemandForUserLocationOrEvidence();
133             }
134
135             XmlReflectionImporter importer = new XmlReflectionImporter(overrides, defaultNamespace);
136             for (int i = 0; i < extraTypes.Length; i++)
137                 importer.IncludeType(extraTypes[i]);
138             XmlTypeMapping mapping = importer.ImportTypeMapping(type, root, defaultNamespace);
139             TempAssembly tempAssembly = XmlSerializer.GenerateTempAssembly(mapping, type, defaultNamespace, location, evidence);
140             return (XmlSerializer)tempAssembly.Contract.TypedSerializers[mapping.Key];
141         }
142
143         [PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
144         void DemandForUserLocationOrEvidence() {
145             // Ensure full trust before asserting full file access to the user-provided location or evidence
146         }
147     }
148 }