Como posso controlar o namespace e o nome do elemento raiz ao serializar um objeto IXmlSerializable com o serializador de contrato de dados?

Eu tenho um tipo que implementaIXmlSerializable com o qual estou serializandoDataContractSerializer. Como posso controlar o namespace e o nome do elemento raiz ao serializá-lo como o elemento raiz de um documento XML?

Digamos que eu tenha o seguinte 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
}

Se eu serializar isso comDataContractSerializer como meu objeto raiz, recebo:

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

Eu quero que o nome da raiz seja<Person> e o espaço para nome raiz a ser"http://www.MyCompany.com", então eu tentei adicionar[DataContract] igual a:

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

Mas quando eu faço,DataContractSerializer lança uma exceção afirmandoO tipo 'PersonDTO' não pode ser IXmlSerializable e tem o 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()

Eu sei que é possível modificar o nome raiz e o espaço para nome usando o comandoDataContractSerializer(Type type, String rootName, String rootNamespace) construtor ao 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" />

Mas existe alguma maneira de fazer isso automaticamente através de atributos?

questionAnswers(1)

yourAnswerToTheQuestion