2011-07-19 16 views
6

最近RestSharpを使用してXMLを使用するRESTサービスを使用し始めました。RestSharpでデータを投稿するときにオブジェクトをシリアライズ

XMLからオブジェクトをdeserializeして、カスタムオブジェクトのコレクションを簡単にします。しかし、私の質問は、を再共有する最善の方法は何ですか?

再初期化にLINQ-to-XMLを使用する必要がありますか?私はSerializeable属性とSerializeToXmlユーティリティ関数を使ってみましたが、そうすると、RestSharpによって実行されたデシリアライズが中断されているようです。

答えて

1

最近のプロジェクトでは、XElement(System.Xml.Linqアセンブリから)を使用して手動でリクエストを作成しました。私は対処するためにいくつかのプロパティを持っていただけです。 RestSharpは、サーバーからの大規模なXMLグラフ応答を非直列化していた実際の問題を解決しました。

オブジェクトモデルがXMLスキーマと似ていない場合は、別のオブジェクトモデルを作成してマップする必要があります。そのため、ライブラリを使用して自動的にシリアル化できます。そのような状況では、手動でスキーマにマッピングする方がよい場合があります。

+0

お返事ありがとうございます! RestSharpは、クラスの名前とプロパティがXML要素と同じ名前を持つ場合、またはxml属性を使用して.NETシリアル化を使用してからXmlSerializerを使用する場合、自動的にシリアル化できますか? – Evan

1

RestSharpが必要な場合は、上書きすることができますいくつかの基本的なXMLシリアル化をサポートしています。

var request = new RestRequest(); 
request.RequestFormat = RequestFormat.Xml; 
request.XmlSerializer = new SuperXmlSerializer(); // optional override, implements ISerializer 
request.AddBody(person); // object serialized to XML using current XML serializer 
+1

ありがとう!組み込みのXMLシリアル化は、[XmlElement( "elementname")]などの属性に注意を払っていますか?それとも、カスタムシリアル化を使用する必要がありますか? – Evan

+1

それはしません。私は属性が嫌いです:)。あなたはISerializerを実装し、そのためにXmlSerializerを渡さなければならないでしょう –

+0

@ JohnSheehan-Runscope Re:* "私は属性が嫌いです" *あなたがこれについてあなたの心を変えたように見えます...私はRestSharp(105.2 .3.0)には[DeserializeAs](https://github.com/restsharp/RestSharp/wiki/Deserialization)属性が含まれています。 Visual Studioのオブジェクトブラウザでは、[この回答](http://stackoverflow.com/a/10726706/1497596)で参照されている** SerializeAs **属性も参照しています。 – DavidRR

3

私は私の状況は比較的簡単ですが、私は必要なもののすべてを取得するために属性を使用することができました。例えば、それはそれらの中にダッシュを持つノードをデシリアライズし、その後、私はこれを使用したのと同じノード名にシリアライズすることができるように取得する:

[XmlElement(ElementName = "short-name")] 
[SerializeAs(Name = "short-name")] 
public string shortName { get; set; } 

だから、あなたの例では、直列化は[XmlElement("elementName")]を尊重していません。代わりに、[SerializeAs(Name = "elementName")]を使用する必要があります。

これは、RestSharpプロジェクトのテストコードをトローリングすることで検出されました。

+0

標準のXMLシリアル化と同じではないので、私はこの解決策が嫌いです。 – jhilden

1

RestSharpのソースコードを調べたところ、実際にはSystem.Xml.Serialization.XmlSerializerという名前のラッパーが組み込まれていることがわかりました。これはデフォルトでは使用されていません。DotNetXmlSerializerそれを使用するには、次の行を追加してください:

var request = new RestRequest(); 
request.RequestFormat = RequestFormat.Xml; 
request.XmlSerializer = new DotNetXmlSerializer(); 
request.AddBody(someObject);