2011-02-01 21 views
37

このXMLをDataContract属性でマークされたオブジェクトに逆シリアル化できますか?DataContract XMLシリアル化とXML属性

<root> 
<distance units="m">1000</distance> 
</root> 

「ユニット」属性があります。私はそれがサポートされているとは思わない。または私は間違っていますか?

答えて

49

これは達成できますが、[XmlSerializerFormat]属性をDataContractに適用することによって、デフォルトのシリアライザをオーバーライドする必要があります。これは実行できますが、これはデフォルトのシリアライザと同様に機能しませんので、注意して使用してください。あなたは、次のコードでこれをテストすることができ

using ... 
using System.Runtime.Serialization; 
using System.ServiceModel; 
using System.Xml.Serialization; 

[DataContract] 
[XmlSerializerFormat] 
public class root 
{ 
    public distance distance=new distance(); 
} 

[DataContract] 
public class distance 
{ 
    [DataMember, XmlAttribute] 
    public string units="m"; 

    [DataMember, XmlText] 
    public int value=1000; 
} 

次のクラス構造は、あなたが後にしている結果得られます

root mc = new root(); 
XmlSerializer ser = new XmlSerializer(typeof(root)); 
StringWriter sw = new StringWriter(); 
ser.Serialize(sw, mc); 
Console.WriteLine(sw.ToString()); 
Console.ReadKey(); 

を出力は次のようになります。

<?xml version="1.0" encoding="utf-16"?> 
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <distance units="m">1000</distance> 
</root> 
+9

XmlSerializerFormat属性を検索する場合は、System.ServiceModel名前空間で見つけることができます。http://msdn.microsoft.com/en-us/library/system.servicemodel.xmlserializerformatattribute%28v=VS.90 %29.aspx – jeffreypriebe

+1

もちろん、それはコーディングのために働く、私は読んでも、ドキュメントを読むのが好きです:) – jeffreypriebe

+0

@GregSansom、あなたが既に参照を追加したことを前提としています。 Resolveはオプションとして表示されない場合は表示されません。 –

24

WCFでデフォルトで使用されるデータ契約シリアライザは、ではありません。は、パフォーマンス上の理由からXML属性をサポートしています(DCSはXMLシリアライザより約10%高速です)。

実際にDCSを使用したい場合は、この構造を使用することはできません。変更する必要があります。

また、Gregが答えで示したように、XmlSerializerをWCFで使用する必要があります。これも機能しますが、DCSのパフォーマンス上の利点(および他のすべての利点)は失われます。