Есть ли способ сериализовать объект (с его атрибутами) в XML?
-
23-08-2019 - |
Вопрос
Создайте класс (назовите его FormElement).Этот класс должен иметь некоторые свойства, такие как метаданные, которые он имеет с элементами данных (имя, порядковый номер, значение — которое представляет собой просто строку и т. д.).
Этот класс имеет атрибуты типа Validation Application Block Validation.
Я хочу сериализовать его в xml и десериализовать.Убедитесь, что все свойства класса, включая атрибуты блока приложения проверки, выдерживают сериализацию.
какое-то предложение?
Нет правильного решения
Другие советы
В .NET Framework это встроено. Используя C#, вы можете сделать это следующим образом:
// This code serializes a class instance to an XML file:
XmlSerializer xs = new XmlSerializer(typeof(objectToSerialize));
using (TextWriter writer = new StreamWriter(xmlFileName))
{
xs.Serialize(writer, InstanceOfObjectToSerialize);
}
Этот фрагмент является примером того, как десериализовать XML-файл обратно в экземпляр класса:
// this code creates a class instance from the file we just made:
objectToSerialize newObject;
XmlSerializer xs = new XmlSerializer(typeof(objectToSerialize));
using (TextReader reader = new StreamReader(xmlFileName))
{
newObject = (ObjectToSerialize) xs.Deserialize(reader);
}
Чтобы они работали, вы должны пометить свой класс атрибутом [Serializable].Если вы хотите сделать вывод XML более красивым, вы можете использовать атрибуты [XmlElement] и [XmlAttribute] в свойствах вашего класса, чтобы они сериализовались в выбранную вами схему.
Говоря «сериализовать», вы имеете в виду использование официального механизма сериализации или достижение аналогичного эффекта?
Если ваши объекты являются bean-компонентами, вы можете использовать отражение для написания общего сервиса, который принимает класс и записывает его имя и свойства.Он может аналогичным образом считывать материалы из XML и генерировать объект (что, по сути, и делает Apache Digester).
Что сказал Джонатон Холланд.
Однако вы также спросили о проверке.Если вы используете код, опубликованный Джонатаном, все ваши объекты воля правильно сериализовать и десериализовать.Но если вы действительно хотите это проверить, есть свойство, которое вы можете установить с помощью своего объекта XmlSerializer для схемы *.xsd для проверки.Вы можете достаточно легко создать схему из своего класса, используя метод xsd.exe
инструмент командной строки, входящий в состав Visual Studio.
Кроме того, похоже, что вы можете контролировать, сериализуются ли определенные свойства вашего класса как атрибуты или элементы.Джонатон затронул эту тему, но я хочу показать пример:
[Serializable]
public class FormElement
{
[XmlAttribute]
public string Name {get; set;};
[XmlAttribute]
public int Sequence {get; set;};
[XmlAttribute]
public string Value {get; set;};
[XmlElement]
public Validation OnValidate{get; set;}
[NonSerialized]
public string UnimportantProperty {get; set;};
}
Наконец, тип каждого свойства, которое вы хотите сериализовать, также должен быть сериализуемым, а сложные типы должны быть сериализованы как XmlElements.В противном случае вы не сможете этого сделать.
XStream это довольно хорошая Java-библиотека для этого.