2012-03-13 11 views
7

xmlに名前空間が含まれている場合、ServiceStack xmlの逆シリアル化が動作する最も簡単な方法です。しかし、私が受け取るXMLには名前空間が含まれていません。最も単純な使用例:XMLデシリアライズはxmlのネームスペースでしか機能しません

[Serializable] 
public class test 
{ 

} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     string xml="<test xmlns=\"http://schemas.datacontract.org/2004/07/\"></test>"; 
     var result = ServiceStack.Text.XmlSerializer.DeserializeFromString<test>(xml); 
    } 
} 

しかし、それは私が望むものではありません。それは、私はいくつかのサービスから入手xmlですので、私は、次のようにデシリアライズしたい:

string xml="<test></test>"; 

しかし、それは私に次のエラーを与える:

DeserializeDataContract: Error converting type: Error in line 1 position 7. 
Expecting element 'test' from namespace 
'http://schemas.datacontract.org/2004/07/'.. 
Encountered 'Element' with name 'test', namespace ''. 

私が試した:

[Serializable] 
[XmlRoot("test", Namespace = "")] 
public class test 

ServiceStack.Text.XmlSerializerは静的なので、新しいシリアライザを作成できません。 Microsoft XmlSerializerまたはServiceStackのいずれかを選択する必要があります(両方ではありません)。意味:この単純な例がうまくいかない場合は、ServiceStackパッケージの他の非常に有用な部分をスキップする必要があります。私が最後に望むのは、入ってくるxmlにダミーの名前空間を挿入することです。

答えて

23

ServiceStackをして、あなたが空の文字列に名前空間を設定するか必要な名前空間を削除するためにXMLをシリアル化するために、.NETのXML DataContractSerializerを使用しています。

[DataContract(Namespace="")] 
public class test { ... } 

しかし、その後、あなたが持つ直列化された対象の各プロパティをマークする必要があります[DataMember]属性。

[assembly: ContractNamespace("", ClrNamespace = "MyServiceModel.DtoTypes")] 

注:より良いオプションは、例えば、あなたのAssembly.csファイルに追加し、アセンブリ属性でC#の名前空間の下にすべてのタイプの空の名前空間を指定することですあなたは[Serializableを]属性を削除することができます - ServiceStackのシリアライザでは使用されていません。 ServiceStackはMicrosoftの以前のXmlSerializerではなく、.NETのDataContractSerializerを使用するため、[XmlRoot]のようなすべてのXmlSerializer属性も役に立たない。

+0

ありがとうございました!それが私が必要としていた欠けているリンクでした!私は何とかServiceStackのためのこのような適切なドキュメントを見つけることができません... – user1154148

+0

あなた自身のXMLデシリアライザを書かなかった何らかの理由はありますか?マイクロソフトでは、動作するJSONシリアライザ/デシリアライザとは異なり、このタイプのマジックソース設定が必要になるようです。 – JasonD

+0

@JasonDええ、私は理由がないとNIHを好きではありません。私はXMLを使用したくないです。 MSのXML DCSはXMLにも非常に優れているため、必要とされる労力の面でほとんどメリットはありません。 – mythz

関連する問題