¿Cómo puedo controlar el nombre y el espacio de nombres del elemento raíz al serializar un objeto IXmlSerializable con el serializador de contrato de datos?

Tengo un tipo que implementaIXmlSerializable con el que estoy serializandoDataContractSerializer. ¿Cómo puedo controlar el espacio de nombres y el nombre del elemento raíz cuando lo serializo como el elemento raíz de un documento XML?

Digamos que tengo el siguiente tipo:

public partial class PersonDTO : IXmlSerializable
{
    public string Name { get; set; }

    #region IXmlSerializable Members

    public System.Xml.Schema.XmlSchema GetSchema()
    {
        return null;
    }

    public void ReadXml(System.Xml.XmlReader reader)
    {
        Name = reader["name"];
        if (!reader.IsEmptyElement)
            reader.Skip();
        reader.Read();
    }

    public void WriteXml(System.Xml.XmlWriter writer)
    {
        writer.WriteAttributeString("name", Name);
    }

    #endregion
}

Si serializo esto conDataContractSerializer como mi objeto raíz obtengo:

<PersonDTO name="John Doe" xmlns="http://schemas.datacontract.org/2004/07/MyClrNamespace" />

Quiero que el nombre raíz sea<Person> y el espacio de nombres raíz para ser"http://www.MyCompany.com"así que intenté agregar[DataContract] al igual que:

[DataContract(Name = "Person", Namespace = "http://www.MyCompany.com")]
public partial class PersonDTO : IXmlSerializable
{
}

Pero cuando lo hago,DataContractSerializer lanza una excepción que indicaEl tipo 'PersonDTO' no puede ser IXmlSerializable y tener el atributo DataContractAttribute:

System.Runtime.Serialization.InvalidDataContractException occurred
  Message="Type 'PersonDTO' cannot be IXmlSerializable and have DataContractAttribute attribute."
  Source="System.Runtime.Serialization"
  StackTrace:
       at System.Runtime.Serialization.XmlDataContract.XmlDataContractCriticalHelper..ctor(Type type)
       at System.Runtime.Serialization.XmlDataContract..ctor(Type type)
       at System.Runtime.Serialization.DataContract.DataContractCriticalHelper.CreateDataContract(Int32 id, RuntimeTypeHandle typeHandle, Type type)
       at System.Runtime.Serialization.DataContract.DataContractCriticalHelper.GetDataContractSkipValidation(Int32 id, RuntimeTypeHandle typeHandle, Type type)
       at System.Runtime.Serialization.DataContract.GetDataContract(RuntimeTypeHandle typeHandle, Type type, SerializationMode mode)
       at System.Runtime.Serialization.DataContractSerializer.get_RootContract()

Sé que es posible modificar el nombre raíz y el espacio de nombres utilizando elDataContractSerializer(Type type, String rootName, String rootNamespace) constructor al serializar manualmente:

var person = new PersonDTO { Name = "John Doe", };

var serializer = new DataContractSerializer(typeof(PersonDTO), "Person", @"http://www.MyCompany.com");
var sb = new StringBuilder();
using (var textWriter = new StringWriter(sb))
using (var xmlWriter = XmlWriter.Create(textWriter))
{
    serializer.WriteObject(xmlWriter, person);
}
Console.WriteLine(sb);
// Outputs <Person name="John Doe" xmlns="http://www.MyCompany.com" />

Pero, ¿hay alguna manera de hacer esto automáticamente a través de atributos?

Respuestas a la pregunta(1)

Su respuesta a la pregunta