DataContractSerializer
とシリアル化しているIXmlSerializable
を実装するタイプがあります。ルート要素の名前空間と名前をXML文書のルート要素として直列化する際に、どのように制御できますか?私は私が手に私のルートオブジェクトとしてDataContractSerializer
でこれをシリアライズした場合データコントラクティブシリアライザを使用してIXmlSerializableオブジェクトをシリアル化するときに、ルート要素の名前空間と名前を制御するにはどうすればよいですか?
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
}
:
<PersonDTO name="John Doe" xmlns="http://schemas.datacontract.org/2004/07/MyClrNamespace" />
私はルート名が<Person>
とルート名前空間にしたい
は、私は以下の型を持っていると言います"http://www.MyCompany.com"
となるように、[DataContract]
を追加してみました。
[DataContract(Name = "Person", Namespace = "http://www.MyCompany.com")]
public partial class PersonDTO : IXmlSerializable
{
}
しかし、私はやるとき、DataContractSerializer
はタイプを述べ例外をスローは「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" />
ただし、属性を使用して自動的にこれを行う方法はありますか?