1 //------------------------------------------------------------------------------
2 // <copyright file="XmlSerializer.cs" company="Microsoft">
3 // Copyright (c) Microsoft Corporation. All rights reserved.
5 // <owner current="true" primary="true">Microsoft</owner>
6 //------------------------------------------------------------------------------
8 namespace System.Xml.Serialization {
10 using System.Reflection;
11 using System.Collections;
13 using System.Xml.Schema;
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;
25 /// <include file='doc\XmlSerializerFactory.uex' path='docs/doc[@for="XmlSerializerFactory"]/*' />
27 /// <para>[To be supplied.]</para>
29 public class XmlSerializerFactory {
30 static TempAssemblyCache cache = new TempAssemblyCache();
32 /// <include file='doc\XmlSerializerFactory.uex' path='docs/doc[@for="XmlSerializerFactory.CreateSerializer"]/*' />
34 /// <para>[To be supplied.]</para>
36 public XmlSerializer CreateSerializer(Type type, XmlAttributeOverrides overrides, Type[] extraTypes, XmlRootAttribute root, string defaultNamespace) {
37 return CreateSerializer(type, overrides, extraTypes, root, defaultNamespace, null);
40 /// <include file='doc\XmlSerializerFactory.uex' path='docs/doc[@for="XmlSerializerFactory.CreateSerializer2"]/*' />
42 /// <para>[To be supplied.]</para>
44 public XmlSerializer CreateSerializer(Type type, XmlRootAttribute root) {
45 return CreateSerializer(type, null, new Type[0], root, null, null);
48 /// <include file='doc\XmlSerializerFactory.uex' path='docs/doc[@for="XmlSerializerFactory.CreateSerializer3"]/*' />
50 /// <para>[To be supplied.]</para>
52 public XmlSerializer CreateSerializer(Type type, Type[] extraTypes) {
53 return CreateSerializer(type, null, extraTypes, null, null, null);
56 /// <include file='doc\XmlSerializerFactory.uex' path='docs/doc[@for="XmlSerializerFactory.CreateSerializer4"]/*' />
58 /// <para>[To be supplied.]</para>
60 public XmlSerializer CreateSerializer(Type type, XmlAttributeOverrides overrides) {
61 return CreateSerializer(type, overrides, new Type[0], null, null, null);
64 /// <include file='doc\XmlSerializerFactory.uex' path='docs/doc[@for="XmlSerializerFactory.CreateSerializer5"]/*' />
66 /// <para>[To be supplied.]</para>
68 public XmlSerializer CreateSerializer(XmlTypeMapping xmlTypeMapping) {
69 TempAssembly tempAssembly = XmlSerializer.GenerateTempAssembly(xmlTypeMapping);
70 return (XmlSerializer)tempAssembly.Contract.TypedSerializers[xmlTypeMapping.Key];
73 /// <include file='doc\XmlSerializerFactory.uex' path='docs/doc[@for="XmlSerializerFactory.CreateSerializer6"]/*' />
75 /// <para>[To be supplied.]</para>
77 public XmlSerializer CreateSerializer(Type type) {
78 return CreateSerializer(type, (string)null);
81 /// <include file='doc\XmlSerializerFactory.uex' path='docs/doc[@for="XmlSerializerFactory.CreateSerializer1"]/*' />
83 /// <para>[To be supplied.]</para>
85 public XmlSerializer CreateSerializer(Type type, string defaultNamespace) {
87 throw new ArgumentNullException("type");
88 TempAssembly tempAssembly = cache[defaultNamespace, type];
89 XmlTypeMapping mapping = null;
90 if (tempAssembly == null) {
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);
103 tempAssembly = new TempAssembly(contract);
105 cache.Add(defaultNamespace, type, tempAssembly);
109 if (mapping == null) {
110 mapping = XmlReflectionImporter.GetTopLevelMapping(type, defaultNamespace);
112 return (XmlSerializer)tempAssembly.Contract.GetSerializer(type);
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
121 /// <include file='doc\XmlSerializerFactory.uex' path='docs/doc[@for="XmlSerializerFactory.CreateSerializer7"]/*' />
123 /// <para>[To be supplied.]</para>
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) {
128 throw new ArgumentNullException("type");
131 if (location != null || evidence != null) {
132 DemandForUserLocationOrEvidence();
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];
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