DataContractSerializer
으로 직렬화하는 IXmlSerializable
을 구현하는 유형이 있습니다. 그것을 XML 문서의 루트 요소로 직렬화 할 때 루트 요소 네임 스페이스와 이름을 어떻게 제어 할 수 있습니까? 루트 네임 스페이스를데이터 계약자 직렬화기를 사용하여 IXmlSerializable 객체를 직렬화 할 때 루트 요소 네임 스페이스와 이름을 제어하는 방법은 무엇입니까?
<PersonDTO name="John Doe" xmlns="http://schemas.datacontract.org/2004/07/MyClrNamespace" />
내가 루트 이름 <Person>
로 원하는 : 내 루트 개체 내가 얻을로 DataContractSerializer
으로이 직렬화 경우
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
}
:
나는 다음과 같은 유형이 말"http://www.MyCompany.com"
이되도록 을 다음과 같이 추가하려고 시도했습니다.
[DataContract(Name = "Person", Namespace = "http://www.MyCompany.com")]
public partial class PersonDTO : IXmlSerializable
{
}
그러나 내가 할 때, DataContractSerializer
이 종류라는 예외를 throw는 'PersonDTO'IXmlSerializable하고 DataContractAttribute 속성 수 없습니다 : 나는 DataContractSerializer(Type type, String rootName, String rootNamespace)
생성자를 사용하여 루트 이름과 네임 스페이스를 수정할 수 알고
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()
을 수동으로 직렬화 할 때 :
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" />
속성을 통해 자동으로이를 수행 할 수있는 방법이 있습니까?