2015-09-17 2 views
1

Я пробую следующий код, чтобы сериализовать мои объекты в XML-файл, но при запуске этого кода последний элемент в списке values сериализовать по счету для списка.Сериализовать несколько объектов в XML

Я хочу сериализовать каждый элемент в списке? что в моем коде

Может ли кто-нибудь мне помочь?

//list of class values    
List<values> valus = new List<values>(); 
values value = new values(); 

foreach (Control control in Controls) 
{ 
    value.ctrlname = control.Name.ToString(); 
    value.ctrllocation = control.Location.ToString(); 
    value.ctrltext = control.Text.ToString(); 
    value.ctrltype = control.GetType().ToString(); 
    value.ctrlstatus = control.Enabled.ToString(); 

    valus.Add(value);  
} 

System.Xml.Serialization.XmlSerializer writer = 
     new System.Xml.Serialization.XmlSerializer(typeof(values)); 

var path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "//Serialization.xml"; 
System.IO.FileStream file = System.IO.File.Create(path); 

foreach (values item in valus) 
{ 
    writer.Serialize(file, item); 
} 

file.Close(); 
+0

Вы повторно перезаписываете один и тот же файл, чтобы ваш файл en ds up, содержащий последний элемент, сериализует список, а не каждый элемент один раз. –

+0

@YaelBS Я пишу комментарий в вашем ответе – Ahmed

ответ

0

Первая позволяет проверить, что ваши классы serialzble, например, так:

[Serializable()] 
public class rootValues 
{ 
    public rootValues() 
    { 
     valuesArray = new List<values>(); 
    } 

    [XmlElement("item", typeof(values))] 
    public List<values> valuesList { get; set; } 
} 

[Serializable()] 
public class values 
{ 
    [System.Xml.Serialization.XmlAttribute("ctrlname")] 
    public string ctrlname { get; set; } 

    //.... 
} 

Во-вторых, вы используете то же имя для списка и объекта

//list of class values    
rootValues valusList = new rootValues(); 

foreach (Control control in Controls) 
{ 
    values value = new values(); // Create new element, in your code it was the same 

    value.ctrlname = control.Name.ToString(); 
    value.ctrllocation = control.Location.ToString(); 
    value.ctrltext = control.Text.ToString(); 
    value.ctrltype = control.GetType().ToString(); 
    value.ctrlstatus = control.Enabled.ToString(); 

    valuesList.valuesList.Add(value);  
} 

System.Xml.Serialization.XmlSerializer writer = new System.Xml.Serialization.XmlSerializer(typeof(rootValues)); 
var path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "//Serialization.xml"; 
System.IO.FileStream file = System.IO.File.Create(path); 
writer.Serialize(file, valusList); 
file.Close(); 

FYI, если вы хотите добавить список class values вы можете сделать это так:

//... 
List<values> SomeListOfvalues = new List<values>(); 

// Init list 
SomeListOfvalues.add(new values()); // Adding first element 
SomeListOfvalues.add(new values()); // Adding second element 

// Adding the whole list to our class 
valuesList.valuesList.addRange(SomeListOfvalues); 
+0

Что такое valuesList в valuesList.Add (value); вы имеете в виду valusList? после замены его valusList дайте мне ошибку не содержать. Добавить метод – Ahmed

+0

about valuesList, если я хочу добавить список значений, названных значениямиList? – Ahmed

+0

только последний комментарий как можно использовать 'valuesList.valuesList.AddRange (SomeotherValueList)' Как можно использовать это – Ahmed

0

write.Serialize, возможно, переписывает содержимое в файл каждый раз, а затем добавляет. Вы можете попробовать сериализовать значения в строке, как в этом вопросе: Serialize an object to string. А затем вручную добавьте файл со строковыми значениями.

В качестве альтернативы вы могли бы сериализовать весь список, а не каждое значение за раз.

0

Ваш первый цикл foreach, который заполняет список, повторно перезаписывает один и тот же объект value и добавляет новые ссылки на один и тот же объект повторно в список. На самом деле вы не добавляете новый элемент в свой список, когда звоните valus.Add(value);.

Попробуйте переместить линию values value = new values(); к началу цикла Еогеаспа или, если вы особенно обеспокоены эффективностям декларирования объекту несколько раз, держать линию values value; вне цикла и добавьте строку value = new values(); внутри цикла Еогеаспа.