このXMLをDataContract属性でマークされたオブジェクトに逆シリアル化できますか?DataContract XMLシリアル化とXML属性
<root>
<distance units="m">1000</distance>
</root>
「ユニット」属性があります。私はそれがサポートされているとは思わない。または私は間違っていますか?
このXMLをDataContract属性でマークされたオブジェクトに逆シリアル化できますか?DataContract XMLシリアル化とXML属性
<root>
<distance units="m">1000</distance>
</root>
「ユニット」属性があります。私はそれがサポートされているとは思わない。または私は間違っていますか?
これは達成できますが、[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>
WCFでデフォルトで使用されるデータ契約シリアライザは、ではありません。は、パフォーマンス上の理由からXML属性をサポートしています(DCSはXMLシリアライザより約10%高速です)。
実際にDCSを使用したい場合は、この構造を使用することはできません。変更する必要があります。
また、Gregが答えで示したように、XmlSerializerをWCFで使用する必要があります。これも機能しますが、DCSのパフォーマンス上の利点(および他のすべての利点)は失われます。
XmlSerializerFormat属性を検索する場合は、System.ServiceModel名前空間で見つけることができます。http://msdn.microsoft.com/en-us/library/system.servicemodel.xmlserializerformatattribute%28v=VS.90 %29.aspx – jeffreypriebe
もちろん、それはコーディングのために働く、私は読んでも、ドキュメントを読むのが好きです:) – jeffreypriebe
@GregSansom、あなたが既に参照を追加したことを前提としています。 Resolveはオプションとして表示されない場合は表示されません。 –