Как сериализовать XML-сериализуемый объект в XML-фрагмент (без XML-объявления или ссылок пространства имен в корневом элементе)?Сериализация в XML-фрагмент - не XML-документ
ответ
Вот хак-иш способ сделать это без необходимости загружать всю выходную строку в XmlDocument:
using System;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
public class Example
{
public String Name { get; set; }
static void Main()
{
Example example = new Example { Name = "Foo" };
XmlSerializer serializer = new XmlSerializer(typeof(Example));
XmlSerializerNamespaces emptyNamespace = new XmlSerializerNamespaces();
emptyNamespace.Add(String.Empty, String.Empty);
StringBuilder output = new StringBuilder();
XmlWriter writer = XmlWriter.Create(output,
new XmlWriterSettings { OmitXmlDeclaration = true });
serializer.Serialize(writer, example, emptyNamespace);
Console.WriteLine(output.ToString());
}
}
Вы должны быть в состоянии только сериализации, как вы обычно делаете, а затем использовать Root
свойство из полученного документа.
Возможно, вам сначала необходимо очистить атрибуты элемента.
+1 Звучит неплохо для меня, но я не объяснил в своем вопросе, что я бы предпочел создать поток, а не XmlDocument. – Emmanuel
Кстати это является удивительным. Я реализовал этот код, чтобы упростить работу с фрагментами xml в виде классов, а затем вы можете просто заменить узел, когда закончите. Это делает переход между кодом и xml ультра-легким.
Сначала создайте несколько методов расширения.
public static class SerializableFragmentExtensions
{
public static XElement ToElement(this ISerializableFragment iSerializableFragment)
{
var serializer = new XmlSerializer(iSerializableFragment.GetType());
var emptyNamespace = new XmlSerializerNamespaces();
emptyNamespace.Add(String.Empty, String.Empty);
var output = new StringBuilder();
var writer = XmlWriter.Create(output,
new XmlWriterSettings { OmitXmlDeclaration = true });
serializer.Serialize(writer, iSerializableFragment, emptyNamespace);
return XElement.Parse(output.ToString(), LoadOptions.None);
}
public static T ToObject<T>(this XElement xElement)
{
var serializer = new XmlSerializer(typeof (T));
var reader = xElement.CreateReader();
var obj = (T) serializer.Deserialize(reader);
return obj;
}
}
Следующая Реализовать необходимый интерфейс (маркерный интерфейс - Я знаю, что вы не должны, но я думаю, что это идеальный повод к этому.)
public interface ISerializableFragment
{
}
Теперь все, что вам нужно сделать, это украсить любой класс Serializable, который вы хотите преобразовать в фрагмент XElement, с интерфейсом.
[Serializable]
public class SomeSerializableClass : ISerializableFragment
{
[XmlAttribute]
public string SomeData { get; set; }
}
Наконец, проверьте код.
static void Main(string[] args)
{
var someSerializableClassObj = new SomeSerializableClass() {SomeData = "Testing"};
var element = someSerializableClass.ToElement();
var backToSomeSerializableClassObj = element.ToObject<SomeSerializableClass>();
}
Еще раз спасибо за этот удивительно полезный код.
Была проблема, с которой я сразу попытался это сделать в своем собственном проекте. С текстовым фрагментом, который точно соответствовал правильному наименованию, как в примере, который я представил, код работал отлично. У меня было имя класса, у которого не было такого имени, как корневой элемент. Ответ заключался в простом добавлении XmlRootAttribute в класс и названии его так же, как имя корневого элемента в xml. Это работало без изъянов. Вы также можете быть уверены, что любые элементы, которые существуют в xmldocument, которые не выражены в определении класса, не нарушают разбор. – jwize
- 1. «Сериализация« SimpleXMLElement »не допускается»
- 2. Сериализация переполнения не работает
- 3. JQuery Сериализация не работает
- 4. Сериализация - не работает
- 5. сериализация сортировки не работает
- 6. сериализация
- 7. сериализация
- 8. Сериализация не реализована?
- 9. Объект Сериализация не работает
- 10. Форма не сериализация
- 11. Сериализация XML - сериализация свойств в пользовательском управлении
- 12. Сериализация и де-сериализация Hadoop
- 13. Сериализация/де-сериализация Boost.Geometry rtree
- 14. VB Сериализация на C# Сериализация
- 15. Сериализация/сериализация Datacontract с изображениями
- 16. J2ME: JSON Сериализация/де-сериализация
- 17. PHP: Сериализация закрытия не допускается
- 18. Пользовательская сериализация класса не работает
- 19. Сериализация не включает скрытые поля
- 20. Пользовательская .NET Сериализация не работает
- 21. C# XML Сериализация Не работает
- 22. Сериализация Цель C не работает
- 23. XML Сериализация: объект не сериализован
- 24. Сериализация очереди типа не работает
- 25. Laravel «Сериализация« закрытия »не допускается»
- 26. Сериализация ArrayList android не работает
- 27. Apscheduler Работа Сериализация не работает
- 28. почему XML-сериализация не работает
- 29. WCF Двунаправленная сериализация не удалась
- 30. Сериализация формы не обновляется слушателем
+1 - Я не думаю, что это действительно хакерство. Возможно, больше работы, чем хотелось бы. Но, в конце концов, это говорит о том, какой формат должен быть выход, прежде чем он выполнит эту работу. Это не взломать. Взломать было бы разбить все после факта и т. Д. –
Я согласен с Эндрю, что это хакерский. Если я не делаю что-то неправильно, все мои элементы имеют атрибут «xmlns =» ». Предпочитал бы, чтобы этого не было вообще. –
** no XmlDocument/XmlNode манипуляции ** – Kiquenet