それはXML属性の代わりに要素を使用していますので、どのように.NETのDataContractの直列化を制御することができますか?
-
09-09-2019 - |
質問
DataContract
し、それにはいくつかのプロパティとしてマークされたクラスはDataMember
属性でマークされている場合は、私は簡単にXMLにそれをシリアライズすることができますが、それはのような出力を作成します。
<Person>
<Name>John Smith</Name>
<Email>john.smith@acme.com</Email>
<Phone>123-123-1234</Phone>
</Person>
私が好む何の属性、であるような...
<Person Name="John Smith" Email="john.smith@acme.com" Phone="123-123-1234" />
DataMember
属性は、私は名前と順序を制御することができますが、それは、要素または属性としてシリアライズされていないかどうか。私は周りを見回したとDataContractFormat
とIXmlSerializable
を見つけましたが、私は簡単に解決策があり期待していますています。
これを行う最も簡単な方法は何ですか?
解決
あなたはDataContractSerializer
でこれを行うことはできません。あなたが属性をしたい場合は、代わりにXmlSerializer
を使用する必要があります。 DataContractSerializer
クラスとXML仕様のより制限サブセットは、パフォーマンスを向上させ、かつ、公開サービスの相互運用性が向上しますが、あなたはXML形式オーバー少なめ制御を与える許可されます。
あなたはを見てWCFサービスを使用している場合あなたはシリアル化XmlSerializerFormatAttribute
を使用することができますXmlSerializer
でます。
他のヒント
あなたはでこれを行うことができます DataContractSerializer - 答えは XMLシリアル化を引き継ぎます 自分で実装することで、 IXmlSerializableインターフェイス。ために 書き込み専用のサポート - あなたは残すことができます 空のReadXmlの説明の実装、および その後のGetSchemaにnullを返し、 でWriteXmlの実装を書きます 次のように:
public class MyPerson : IXmlSerializable
{
public string Name { get; set;}
public string Email { get; set;}
public string Phone { get; set;}
public XmlSchema GetSchema() { return null; }
public void ReadXml(XmlReader reader) { }
public void WriteXml(XmlWriter writer)
{
writer.WriteAttributeString("name", Name);
writer.WriteAttributeString("email", Email);
writer.WriteAttributeString("phone", Phone);
}
}
あなたにもJSONのシリアライズ、たとえば、同じタイプを使用している場合は、、そして、あなたはまだのDataContractを追加して自由であり、データメンバー属性 - 。XMLを書くときにのみDataContractSerializerがIXmlSerializableインターフェイスの実装を利用します。
私はここにについてブログ>。
あなたは、属性と要素の間で前後に変換することができます。後者のために、次の作品ます。
private XmlReader AttributesToElements( Stream stream )
{
var root = XElement.Load( stream );
foreach ( var element in root.Descendants() ) {
foreach ( var attribute in element.Attributes() )
element.Add( new XElement( root.Name.Namespace + attribute.Name.LocalName, (string)attribute ) );
element.Attributes().Remove();
}
return root.CreateReader();
}