2012-04-23 31 views
5

Tôi cố gắng để làm một chút rất đơn giản của serialization với XmlSerializer:Setter không gọi khi deserializing bộ sưu tập

public struct XmlPerson 
{ 
    [XmlAttribute] public string Id { get; set; } 
    [XmlAttribute] public string Name { get; set; } 
} 

public class GroupOfPeople 
{ 
    private Dictionary<string, string> _namesById = new Dictionary<string, string>(); 

    //pseudo property for serialising dictionary to/from XML 
    public List<XmlPerson> _XmlPeople 
    { 
     get 
     { 
      var people = new List<XmlPerson>(); 
      foreach (KeyValuePair<string, string> pair in _namesById) 
       people.Add(new XmlPerson() { Id = pair.Key, Name = pair.Value }); 

      return people; 
     } 
     set 
     { 
      _namesById.Clear(); 
      foreach (var person in value) 
       _namesById.Add(person.Id, person.Name); 
     } 
    }  
} 

Saving lớp này hoạt động tốt, và tôi nhận được:

<?xml version="1.0" encoding="utf-8"?> 
<GroupOfPeople xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <_XmlPeople> 
     <XmlPerson Id="person1" Name="Fred" /> 
     <XmlPerson Id="person2" Name="Bill" /> 
     <XmlPerson Id="person3" Name="Andy" /> 
     <XmlPerson Id="person4" Name="Nagesh" /> 
    </_XmlPeople> 
</GroupOfPeople> 

Tuy nhiên, khi Tôi đọc lại trong tập tin, thiết lập thuộc tính _XmlPeople của tôi không bao giờ được gọi, và do đó từ điển trống. Tất cả các thuộc tính khác trên đối tượng này nhận được tiền phạt deserialized.

Tôi có thiếu thứ gì đó hiển nhiên không? Tôi đã thử nhiều loại bộ sưu tập khác nhau nhưng không ai trong số họ deserialize.

EDIT: Đọc mã:

try 
{ 
    using (var stream = new StreamReader(itemPath)) 
    { 
     var xml = new XmlSerializer(typeof(GroupOfPeople)); 
     GroupOfPeople item = (GroupOfPeople)xml.Deserialize(stream); 
    } 
} 
//snip error stuff 
+0

làm cách nào để đọc? – Tigran

+0

Đã chỉnh sửa bằng mã. – GazTheDestroyer

+0

Thiết lập không bao giờ được gọi. Tôi có một breakpoint ngồi trên đó. – GazTheDestroyer

Trả lời

2

bạn đã thử sử dụng thuộc tính XmlArray?

Với ví dụ của bạn nó sẽ là một cái gì đó như thế này:

[XmlArray] 
[XmlArrayItem(ElementName="XmlPerson")] 
public List<XmlPerson> XmlPeople 

EDIT:

Ở đây, hãy thử các cấu trúc sau:

public struct XmlPerson 
{ 
    [XmlAttribute] public string Id { get; set; } 
    [XmlAttribute] public string Name { get; set; } 
} 


public class GroupOfPeople 
{ 
    [XmlArray] 
    [XmlArrayItem(ElementName="XmlPerson")] 
    public List<XmlPerson> XmlPeople { get; set; } 
} 

Tôi không nghĩ rằng nó sẽ được dễ dàng để thêm mã vào Setter của danh sách, vì vậy những gì về việc nhận được rằng từ điển khi bạn thực sự cần nó?

Như thế này:

private Dictionary<string, string> _namesById; 

public Dictionary<string, string> NamesById 
{ 
    set { _namesById = value; } 
    get 
    { 
     if (_namesById == null) 
     { 
      _namesById = new Dictionary<string, string>(); 

      foreach (var person in XmlPeople) 
      { 
       _namesById.Add(person.Id, person.Name); 
      } 
     } 

     return _namesById; 
    } 
} 

Bằng cách này bạn sẽ nhận được các mục từ XML và cũng sẽ mantain mà điển của bạn.

+0

Không. Các thuộc tính rõ ràng được ghi nhận khi lưu, nhưng vẫn không tải. :/ – GazTheDestroyer

+0

@GazTheDestroyer Đã chỉnh sửa câu trả lời để bao gồm một số mẫu mã. – Smur

+0

Đã thực hiện một số sửa lỗi (xem câu trả lời của tôi), nhưng đã đặt câu trả lời của bạn là chính xác vì nó giải quyết được sự cố. Chỉ cần đặt câu trả lời của tôi cho rõ ràng trong trường hợp bất cứ ai khác có vấn đề. – GazTheDestroyer

13

trả lời cho rõ ràng:

đã thực hiện một số lỗi và thấy rằng XmlSerializer không gọi setter cho một bộ sưu tập.

Thay vào đó, hãy gọi số getter và sau đó thêm các mục vào bộ sưu tập được trả lại. Vì vậy, một giải pháp như Felipe là cần thiết.

Các vấn đề liên quan