Так что я пытаюсь просто украсить класс, чтобы сериализовать его как XML. Вот пример моей проблемы..NET Serialize XmlNode проблема
[XmlElement("Dest")]
public XmlNode NewValue { get; set; }
Реальная проблема здесь в том, что иногда в этом РЕАЛИЗАЦИЯ XmlNode может быть XmlElement или XmlAttribute. когда это элемент, этот код работает нормально, но когда он приходит как атрибут, сериализатор выдает следующую ошибку:
System.InvalidOperationException: Невозможно записать узел типа XmlAttribute в качестве значения элемента. Используйте XmlAnyAttributeAttribute с массивом XmlNode или XmlAttribute, чтобы записать узел в качестве атрибута.
Я пробовал XmlAnyAttribute, но это тоже не удалось. Так просто поставить, как я могу сериализовать XmlNode?
Для записи я указал правильный ответ ниже. Вы должны его взломать. Вот примерно то, что я реализовал сам, если кто-то еще этого ударит.
[XmlIgnore()]
public XmlNode OldValue { get; set; }
[XmlElement("Dest")]
public XmlNode SerializedValue
{
get
{
if (OldValue == null)
{
return null;
}
if (OldValue.NodeType == XmlNodeType.Attribute)
{
XmlDocumentFragment frag = OldValue.OwnerDocument.CreateDocumentFragment();
XmlElement elem = (frag.OwnerDocument.CreateNode(XmlNodeType.Element, "SerializedAttribute", frag.NamespaceURI) as XmlElement);
elem.SetAttribute(OldValue.Name, OldValue.Value);
return elem;
}
else
{
return OldValue;
}
}
set
{
if (value == null)
{
OldValue = null;
return;
}
if ((value.Attributes != null) && (value.NodeType == XmlNodeType.Element) && ((value.ChildNodes == null) || (value.ChildNodes.Count == 0)))
{
OldValue = value.Attributes[0];
}
else
{
OldValue = value;
}
}
}
Как вы ожидаете, что он сериализует атрибут как узел? – Grzenio
Я понимаю, что XmlElement ошибочно пытается его сериализовать, но там нет опции XmlNode. Поскольку класс XmlAttribute является дочерним классом класса XmlNode, я бы ожидал, что он обработает его просто отлично. – SamuelWarren