| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- //-----------------------------------------------------------------------------
- // Copyright (c) Microsoft Corporation. All rights reserved.
- //-----------------------------------------------------------------------------
- namespace System.ServiceModel.Dispatcher
- {
- using System;
- using System.Xml;
- using System.ServiceModel;
- using System.Xml.Serialization;
- using System.Collections.Generic;
- using System.Runtime.Serialization;
- using System.ServiceModel.Description;
- internal class XmlSerializerObjectSerializer : XmlObjectSerializer
- {
- XmlSerializer serializer;
- Type rootType;
- string rootName;
- string rootNamespace;
- bool isSerializerSetExplicit = false;
- internal XmlSerializerObjectSerializer(Type type)
- {
- Initialize(type, null /*rootName*/, null /*rootNamespace*/, null /*xmlSerializer*/);
- }
- internal XmlSerializerObjectSerializer(Type type, XmlQualifiedName qualifiedName, XmlSerializer xmlSerializer)
- {
- if (qualifiedName == null)
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("qualifiedName");
- }
- Initialize(type, qualifiedName.Name, qualifiedName.Namespace, xmlSerializer);
- }
- void Initialize(Type type, string rootName, string rootNamespace, XmlSerializer xmlSerializer)
- {
- if (type == null)
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("type");
- }
- this.rootType = type;
- this.rootName = rootName;
- this.rootNamespace = rootNamespace == null ? string.Empty : rootNamespace;
- this.serializer = xmlSerializer;
- if (this.serializer == null)
- {
- if (this.rootName == null)
- this.serializer = new XmlSerializer(type);
- else
- {
- XmlRootAttribute xmlRoot = new XmlRootAttribute();
- xmlRoot.ElementName = this.rootName;
- xmlRoot.Namespace = this.rootNamespace;
- this.serializer = new XmlSerializer(type, xmlRoot);
- }
- }
- else
- isSerializerSetExplicit = true;
- //try to get rootName and rootNamespace from type since root name not set explicitly
- if (this.rootName == null)
- {
- XmlTypeMapping mapping = new XmlReflectionImporter().ImportTypeMapping(this.rootType);
- this.rootName = mapping.ElementName;
- this.rootNamespace = mapping.Namespace;
- }
- }
- public override void WriteObject(XmlDictionaryWriter writer, object graph)
- {
- if (this.isSerializerSetExplicit)
- this.serializer.Serialize(writer, new object[] { graph });
- else
- this.serializer.Serialize(writer, graph);
- }
- public override void WriteStartObject(XmlDictionaryWriter writer, object graph)
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new NotImplementedException());
- }
- public override void WriteObjectContent(XmlDictionaryWriter writer, object graph)
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new NotImplementedException());
- }
- public override void WriteEndObject(XmlDictionaryWriter writer)
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new NotImplementedException());
- }
- public override object ReadObject(XmlDictionaryReader reader, bool verifyObjectName)
- {
- if (this.isSerializerSetExplicit)
- {
- object[] deserializedObjects = (object[])this.serializer.Deserialize(reader);
- if (deserializedObjects != null && deserializedObjects.Length > 0)
- return deserializedObjects[0];
- else
- return null;
- }
- else
- return this.serializer.Deserialize(reader);
- }
- public override bool IsStartObject(XmlDictionaryReader reader)
- {
- if (reader == null)
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("reader"));
- reader.MoveToElement();
- if (this.rootName != null)
- {
- return reader.IsStartElement(this.rootName, this.rootNamespace);
- }
- else
- {
- return reader.IsStartElement();
- }
- }
- }
- }
|