それはXML属性の代わりに要素を使用していますので、どのように.NETのDataContractの直列化を制御することができますか?

StackOverflow https://stackoverflow.com/questions/591907

質問

私は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属性は、私は名前と順序を制御することができますが、それは、要素または属性としてシリアライズされていないかどうか。私は周りを見回したとDataContractFormatIXmlSerializableを見つけましたが、私は簡単に解決策があり期待していますています。

これを行う最も簡単な方法は何ですか?

役に立ちましたか?

解決

あなたは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();
    }
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top