Есть ли способ сериализовать объект (с его атрибутами) в XML?

StackOverflow https://stackoverflow.com/questions/390800

  •  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-библиотека для этого.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top