2012-03-13 27 views
7

Hizmet için ServiceStack xml serileştirme işleminin en basit yolu, xml bir ad alanı içerdiğinde gerçekleşir. Ancak, aldığım xml ad alanı içermiyor. En basit örnek:XML serileştirme, yalnızca xml içinde ad alanı ile çalışır

[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); 
    } 
} 

Ancak, istediğim bu değil.

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

Ama bu bana aşağıdaki hata veriyor:

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 ''. 

Denedim:

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

O xml olduğundan birkaç hizmetlerden olsun, şu serisini istiyorum ServiceStack.Text.XmlSerializer statik olduğundan yeni bir seri hale getirici oluşturamıyorum. Microsoft XmlSerializer VEYA ServiceStack'ı (her ikisini de değil) seçmem gerekiyor. Anlamı: Bu basit örneği işe yaramazsam ServiceStack paketinin başka bir çok kullanışlı bölümünü atlamam gerekiyor. İstediğim son şey gelen xml'de kukla ad alanı enjekte etmektir.

cevap

23

ServiceStack size boş bir dizeye Ad Alanı ayarlamak yapmalı ya Namespaces kaldırmak için XML seri hale getirmek için .NET'in Xml DataContractSerializer kullanır:

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

Ama o zaman sen ile seri istediğiniz her özelliği işaretlemek gerekecek [DataMember] özellikleri.

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

Not: Daha iyi bir seçenek, örneğin sizin Assembly.cs dosyasında ekleyerek ve Montaj özniteliği tarafından bir C# ad altında her türlü boş ad belirtmektir sen [Serializable] özniteliği kaldırabilirsiniz - ServiceStack'ın serileştiricileri tarafından kullanılmaz. Ayrıca ServiceStack, Microsoft'un önceki XmlSerializer değil, .NET'in DataContractSerializer'ı kullandığından, [XmlRoot] gibi tüm XmlSerializer öznitelikleri kullanılamaz.

+0

Teşekkürler! İhtiyacım olan eksik bağlantıydı! ServiceStack için bu gibi doğru belgeleri bulamıyorum ... – user1154148

+0

Kendi XML deserializer'ınızı yazmadığınız herhangi bir sebep var mı? Microsoft'un, çalıştığı JSON serializer/deserializer'ın aksine, çalışmasını sağlamak için sadece bu tür sihirli sos konfigürasyonuna ihtiyacı var gibi görünüyor. – JasonD

+0

@JasonD Evet NIH'ing'i iyi bir sebep olmadan sevmiyorum ve XML kullanmamayı tercih ediyorum. MS'nin XML DCS'si de XML için oldukça iyi bir performans sergiliyor, ihtiyaç duyduğu çaba için çok az fayda var. – mythz

İlgili konular