2009-02-20 3 views
4

Использование C# ... У меня есть небольшое приложение, которое создает объекты из класса и добавляет их в коллекцию объектов, а также некоторые элементы интерфейса пользователя, чтобы отображать определенные значения из выбранного в данный момент объект в коллекции (с использованием интерфейса WPF). Поэтому я хочу добавить возможность позволить пользователю сохранить свою коллекцию объектов в файл, чтобы они могли загрузить его при следующем запуске приложения.Экспортировать коллекцию объектов в файл XML

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

Here is a screenshot of the app

+0

ли любой из ниже ответит на ваш вопрос? – DMCS

+0

Я считаю, что они есть, просто взглянув на ответы. Тем не менее, я еще не успел попасть в эту часть своего приложения. Конечно, я тоже планирую, потому что хочу знать, как это сделать. – MattSlay

ответ

4

System.Runtime.Serialization ваш друг здесь, если вы решите пойти на XML.

В одном из моих тестовых приложений иногда мне приходится сериализовать объект как XML, чтобы я мог смотреть на него в автономном режиме. Вот фрагмент, который я использую (никоим образом не оптимизированный, просто быстро сбил один день, и он работал так, как он мне нужен).

public static string ObjectToXml<T>(T objectToSerialise) 
{ 
    StringWriter Output = new StringWriter(new StringBuilder()); 
    XmlSerializer xs = new XmlSerializer(objectToSerialise.GetType()); 
    XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
    ns.Add("MyNs", "http://www.someXmlNamespace/namespace1"); // add as many or few as you need 
    xs.Serialize(Output, objectToSerialise, ns); 
    return Output.ToString(); 
} 

После этого тривиально передавать данные в файл.

Примечание:
мне нужно, чтобы быть в состоянии получить содержимое XML в виде строки, так что я мог сохраняться это один из нескольких способов. Было бы легко создать метод прямого перехода на диск, если это то, что вам нужно.
Несмотря на то, что это работает для меня, вам может потребоваться настроить, чтобы удовлетворить ваши собственные потребности.

2

XML сериализации в порядке и хорошо для многих ситуаций, но выход будет немного громоздким из-за присущих XML накладных расходов. В этой ситуации, когда содержимое файла не должно быть читаемым человеком, это открывает другие варианты.

Сериализация JSON поможет сохранить размер файла. JavaScriptSerializer можно найти в System.Web.Script.Serialization (System.Web.Extensions.dll).

В приведенном ниже примере у меня есть типизированный общий список ConfigurationItem. Элемент конфигурации похож на любой другой класс, но свойства должны быть общедоступными для их сериализации.

var strFileData = System.IO.File.ReadAllText("FileName.data"); 
var jss = new JavaScriptSerializer(); 
var objItemsList = jss.Deserialize<List<ConfigurationItem>>(strFileData); 
// {insert code here tomanipulate object "objItemsList"} 
var strNewData = jss.Serialize(objItemsList); 
System.IO.File.WriteAllText("FileName.data", strNewData); 
1

Проблема сериализации в XML является то, что если ваш класс сериализации изменения (новая недвижимость), то XML не может быть использован для воссоздания экземпляра этого класса.

Если класс достаточно прост (или даже если это не так) вы можете сделать это вручную:

XmlDocument doc = new XmlDocument(); 
XmlNode root = doc.CreateNode(XmlNodeType.Element,"root") 
doc.AppendChild(root) 
XmlNode newPage = doc.CreateNode(XmlNodeType.Element,"pattern") 
root.AppendChild(newPage) 
newPage.Attributes.Append(doc.CreateAttribute("Name",pattern.Name) 
foreach (Hole h in pattern.Holes) 
{ 
    XmlNode hole = doc.CreateNode(XmlNodeType.Element,"hole") 
    hole.Attributes.Append(doc.CreateAttribute("XCoord",h.Xcoord) 
    hole.Attributes.Append(doc.CreateAttribute("YCoord",h.Ycoord) 
    newPage.AppendChild(hole) 
} 
// etc 
doc.Save("output.xml") 

Этот код является грубым, но он будет генерировать что-то вроде:

<root> 
    <pattern name="Pattern1"> 
    <hole XCoord="100" YCoord="50" /> 
    </pattern> 
</root> 
+0

Как показать сохранение как всплывающее окно с использованием того же кода? – cracker

+0

@cracker, что вы имеете в виду? – benPearce

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