Экспорт коллекции объектов в файл XML - PullRequest
4 голосов
/ 20 февраля 2009

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

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

Вот скриншот приложения

Ответы [ 4 ]

4 голосов
/ 20 февраля 2009

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 голосов
/ 24 февраля 2009

Сериализация 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 голос
/ 26 февраля 2009

Проблема с сериализацией в 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 голосов
/ 20 февраля 2009

В StackOverflow есть множество тем о сериализации XML, в том числе несколько отличных постов, касающихся некоторых скрытых ошибок:

Сохранение структур данных с использованием сериализации

Сериализация Gotchyas

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...