2015-11-03 3 views
1

У меня есть этот класс:Как хранить и извлекать объекты из Xml файла

public class MyMenu 
{ 
    public string Name { get; set; } 
    public string Type { get; set; } 
} 

Этот класс я хочу использовать его в динамическом меню, и я не хочу, чтобы хранить свои данные в базе данных.

Я хочу сохранить его данные в файле Xml.

До сих пор у меня есть это для сохранения данных:

string path = Server.MapPath("~/Content/Files"); 
XmlSerializer serial = new XmlSerializer(model.GetType()); 
System.IO.StreamWriter writer = new System.IO.StreamWriter(path + "\\ribbonmenu"); 
serial.Serialize(writer, model); 
writer.Close(); 

И это, чтобы получить данные:

string path = Server.MapPath("~/Content/Files"); 
XmlSerializer serial = new XmlSerializer(typeof(RibbonMenu)); 
System.IO.StreamReader reader = new System.IO.StreamReader(path + "\\ribbonmenu");   
RibbonMenu menu =(RibbonMenu) serial.Deserialize(reader); 
reader.Close(); 

То, что я работает для одного объекта, чтобы сохранить и получить. мне нужно сохранить несколько объектов, и получить коллекцию объектов, что-то вроде:

IEnumerable<MyMenu> model=(IEnumerable<MyMenu>) serial.Deserialize(reader); 

Может кто-нибудь дать мне решение? Благодарю.

Edit: Содержание сгенерированного Xml с моим кодом:

<?xml version="1.0" encoding="utf-8"?> 
<MyMenu xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Id>0</Id> 
    <Menu>Home</Menu> 
    <Type>Button</Type> 

</MyMenu> 
+0

Вы посмотрели [это] (http://stackoverflow.com/questions/1212742/xml-serialize-generic-list-of-serializable-objects) и [это] (http://stackoverflow.com/ вопросы/178899/сериализация-листы-оф-классы-к-XML)? – Kilazur

+0

Трудно сказать, не видя, как выглядит XML. –

+1

1. Я понимаю в модели сериализации кода. Модель GetType() -> - это один элемент MyMenu, поэтому у вас должна быть коллекция здесь, иначе она будет естественно десериализоваться на один элемент , 2. Вы вручную записали этот XML? Теги открытия не совпадают с закрывающими тегами. (Меню -> Действие, Тип -> Контроллер) –

ответ

0

При сериализации следует инициализировать коллекцию так:

var model = new List<MyMenu>() 
{ 
    new MyMenu() { Name = "Menu1", Type = "Ribbon" }, 
    new MyMenu() { Name = "Menu2", Type = "Ribbon" }, 
}; 

Таким образом, когда вы сериализацию вы бы получить что-то вроде этого:

<?xml version="1.0" encoding="utf-8"?> 
<ArrayOfMyMenu xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <MyMenu> 
    <Name>Menu1</Name> 
    <Type>Ribbon</Type> 
    </MyMenu> 
    <MyMenu> 
    <Name>Menu2</Name> 
    <Type>Ribbon</Type> 
    </MyMenu> 
</ArrayOfMyMenu> 

И вы можете вернуть объект, используя List as тип сериализатора:

XmlSerializer serial = new XmlSerializer(typeof(List<MyMenu>)); 
System.IO.StreamReader reader = new System.IO.StreamReader("ribbonmenu.xml"); 
var menu = (List<MyMenu>)serial.Deserialize(reader); 
reader.Close(); 

Надеюсь, что это поможет.

Смежные вопросы