2013-08-21 20 views
6

Nesnelerin bir listesini serileştirmede sorun yaşıyorum. Bir nesneyi serileştirmek için sadece bir nesne alabilirim ancak listeyi alamıyorum. Hata alıyorum sadece boş bir Liste döndürür.Seri yeniden serileştirme sorunları Nesne listesi

<locations> 
    <location locationtype="building" locationtypeid="1"> 
    <id>1</id> 
    <name>Building Name</name> 
    <description>Description of Building</description> 
    </location> 
</locations> 

Bu aldığım sınıftır ve ben GetAll yönteminde deserializing ediyorum: Bu deneyin

[Serializable()] 
[XmlRoot("location")] 
public class Building 
{ 
    private string method; 

    [XmlElement("id")] 
    public int LocationID { get; set; } 
    [XmlElement("name")] 
    public string Name { get; set; } 
    [XmlElement("description")] 
    public string Description { get; set; } 
    [XmlElement("mubuildingid")] 
    public string MUBuildingID { get; set; } 

    public List<Building> GetAll() 
    { 
     var listBuildings = new List<Building>(); 
     var building = new Building(); 
     var request = WebRequest.Create(method) as HttpWebRequest; 
     var response = request.GetResponse() as HttpWebResponse; 

     var streamReader = new StreamReader(response.GetResponseStream()); 
     TextReader reader = streamReader; 
     var serializer = new XmlSerializer(typeof(List<Building>), 
      new XmlRootAttribute() { ElementName = "locations" }); 
     listBuildings = (List<Building>)serializer.Deserialize(reader); 

     return listBuildings; 
    } 
} 
+0

hata aldın mı? –

+0

Serileştirilmediğini hangi listeden göremiyorsunuz? 'GetAll()' yöntemiyse, sınıflandırma yöntemlerini çağırmanın işinde diziselleştiriciler (iyi, muhtemelen nadiren, sanırım) olmadığından. Bir nesnenin mülkiyet değerlerini koruma işinde. – 48klocs

+0

Hata alıyorum, sadece boş bir listeye dönüyor. GetAll Yöntemi Serileştirmeye çalışmıyorum, bir web servisinden seri hale getirilmek ve bu yapı nesnesini doldurmak için Tüm Yöntemi Al'ı kullanıyorum. –

cevap

6

: Bu döndürülmeden XML serisini Sonra

[XmlRoot("locations")] 
public class BuildingList 
{ 
    public BuildingList() {Items = new List<Building>();} 
    [XmlElement("location")] 
    public List<Building> Items {get;set;} 
} 

tüm BuildingList nesnesi.

var xmlSerializer = new XmlSerializer(typeof(BuildingList)); 
var list = (BuildingList)xmlSerializer.Deserialize(xml); 
+0

FYI, eğer öznitelikleri (ör. 'Locationtype' vb.) Serileştirmeniz gerekiyorsa, ilgili XmlAttribute ile karşılık gelen özelliği de dekore edebilirsiniz. – ricovox

+0

Hata Öznitelik 'XmlElement' bu bildirim türünde geçerli değil. Sadece 'emlak, endeksleyici, alan, param, iade' beyanları için geçerlidir. –

+0

Tamam, sanırım sorunu görüyorum. Cevabımı güncelleyeceğim. – ricovox

2

Bina size xml sahip yere karşılık gelen, ancak eşdeğer adlandırılmış eğer bana daha mantıklı nasıl emin değilim. Bunun yerine bir List kullanmanın bir LocationList kullanmak ve olur:

[Serializable()] 
[XmlRoot("locations")] 
public class LocationCollection{ 
    [XmlElement("location")] 
    public Location[] Locations {get;set;} 
} 

[Serializable()] 
[XmlRoot("location")] 
public class Location 
{  
    [XmlElement("id")] 
    public int LocationID { get; set; } 
    [XmlAttribute("locationtype")] 
    public string LocationType {get;set;} 
    [XmlElement("name")] 
    public string Name { get; set; } 
    [XmlElement("description")] 
    public string Description { get; set; } 
    [XmlElement("mubuildingid")] 
    public string MUBuildingID { get; set; }  
} 

Bundan sonra aşağıdaki serisini: Bu eski bir (er) soru olduğunu biliyorum

var request = WebRequest.Create(method) as HttpWebRequest; 
var response = request.GetResponse() as HttpWebResponse; 

var streamReader = new StreamReader(response.GetResponseStream()); 
TextReader reader = streamReader; 
var serializer = new XmlSerializer(typeof(LocationCollection), 
    new XmlRootAttribute() { ElementName = "locations" }); 
var listBuildings = (LocationCollection)serializer.Deserialize(reader); 

return listBuildings; 
+0

Building, yalnızca bir tür LocationType'tır ve bu özel uygulama sadece binalara ihtiyaç duyar, bu nedenle webservice'de yer alacak bir uygulama nesnesi olan uygulama nesnesine sahiptir. Nesnede lokalize olan her şeyi muhafaza eden bir metotta veya statik bir metotta döndürdüğünden beri sadece Koleksiyonlar için başka bir sınıf yaratmaya çalışıyorum. –

+1

IMHO, bir web servisini dahili olarak çağıran bir DTO benim için gerçekten kötü bir fikir gibi görünüyor. Ayrıca, hala LocationCollection iç tutabilir ve sonra sadece listBuildings.Locations dönmek, Konum [] – DavidN

+0

Bu ne gönderdim farklı nedir? Yalnızca bir List Listesinden bir diziye geçiş yaptınız ve OP bir Liste istedi ricovox

3

, ama bu mücadele bugün ve kapsülleme gerektirmeyen bir cevap buldu.

Varsayım 1: Kaynak Xml üzerinde denetiminiz var ve nasıl oluşturulduğu.

Varsayım 2: Bir List<T> nesnesine doğrudan Xml tefrika çalışıyoruz Sen xxx sınıfının adıdır ArrayOfxxx olarak Xml içinde Kök elemanı (veya ismi gerekir

  1. XmlType içinde belirtilen (bkz. 2.))
  2. Eğer xml Elements öğesinin sınıfa farklı bir ad vermesini isterseniz, sınıfta XmlType kullanmalısınız.

Not: (veya sınıf adı) sizin Tip adı küçük harfle başlıyorsa, sen büyük harfe ilk karakteri dönüştürmek gerekir.

Örnek 1 - XmlType

class Program 
{ 
    static void Main(string[] args) 
    { 
     //String containing the xml array of items. 
     string xml = 
@"<ArrayOfItem> 
    <Item> 
     <Name>John Doe</Name> 
    </Item> 
    <Item> 
     <Name>Martha Stewart</Name> 
    </Item> 
</ArrayOfItem>"; 


     List<Item> items = null; 
     using (var mem = new MemoryStream(Encoding.Default.GetBytes(xml))) 
     using (var stream = new StreamReader(mem)) 
     { 
      var ser = new XmlSerializer(typeof(List<Item>)); //Deserialising to List<Item> 
      items = (List<Item>)ser.Deserialize(stream); 
     } 

     if (items != null) 
     { 
      items.ForEach(I => Console.WriteLine(I.Name)); 
     } 
     else 
      Console.WriteLine("No Items Deserialised"); 

    } 
} 

public class Item 
{ 
    public string Name { get; set; } 
} 

Örnek 2 olmadan - XmlType

class Program 
{ 
    static void Main(string[] args) 
    { 
     //String containing the xml array of items. 
     //Note the Array Name, and the Title case on stq. 
     string xml = 
@"<ArrayOfStq> 
    <stq> 
     <Name>John Doe</Name> 
    </stq> 
    <stq> 
     <Name>Martha Stewart</Name> 
    </stq> 
</ArrayOfStq>"; 


     List<Item> items = null; 
     using (var mem = new MemoryStream(Encoding.Default.GetBytes(xml))) 
     using (var stream = new StreamReader(mem)) 
     { 
      var ser = new XmlSerializer(typeof(List<Item>)); //Deserialising to List<Item> 
      items = (List<Item>)ser.Deserialize(stream); 
     } 

     if (items != null) 
     { 
      items.ForEach(I => Console.WriteLine(I.Name)); 
     } 
     else 
      Console.WriteLine("No Items Deserialised"); 

    } 
} 

[XmlType("stq")] 
public class Item 
{ 
    public string Name { get; set; } 
} 
-1

için [XMLArray] toplama özellikleri ile.

0

Eski bir soru biliyorum, ama benzer bir sorunla karşılaştığında karşılaştım. Bina üzerinde @ ricovox cevabı ve OP'ın söz bağlamında, bu onun xml seri hale getirmek için kullanacağı modeli:

[Serializable, XmlRoot("locations")] 
public class BuildingList 
{ 
    [XmlArrayItem("location", typeof(Building))] 
    public List<Building> locations { get; set; } 
} 

[Serializable] 
public class Building 
{ 
    public int LocationID { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public string MUBuildingID { get; set; } 

    public List<Building> GetAll() 
    { 
     ... 
    } 
} 
Ne

OP'ın hata root olarak liste öğesi oluşturmak için oldu

İlgili konular