Почему событие XmlSerializer.UnknownAttribute/UnknownNode возникает при десериализации дочерних классов?C#

Место общения программистов C#
Ответить
Anonymous
 Почему событие XmlSerializer.UnknownAttribute/UnknownNode возникает при десериализации дочерних классов?

Сообщение Anonymous »

У меня возникла проблема с десериализацией XML-кода, созданного XmlSerializer, при использовании дочерних классов. Триггеры событий UnknownAttribute и UnknownNode, и я предположил, что произошла ошибка при десериализации XML. Оказывается, если не настроить обработчики или игнорировать события, десериализация все равно будет успешной.
Пример кода:

Код: Выделить всё

using System;
using System.Collections.Generic;
using System.IO;
using System.Xml.Serialization;

namespace XmlTest
{
public class Program
{
public abstract class ParentClass
{
public int Prop1 { get; set; } = 1;
public int Prop2 { get; set; } = 2;
}

public class ChildClassA : ParentClass
{
public int PropA3 { get; set; } = 3;
public int PropA4 { get; set; } = 4;
}

public class ChildClassB : ParentClass
{
public int PropB5 { get; set; } = 5;
public int PropB6 { get; set; } = 6;
}

[XmlInclude(typeof(ChildClassA))]
[XmlInclude(typeof(ChildClassB))]
public class CollectionClass
{
public List
 classList { get; set; }
}

static void Main(string[] args)
{
CollectionClass collectionClassWrite = new CollectionClass();
collectionClassWrite.classList = new List();
collectionClassWrite.classList.Add(new ChildClassA());
collectionClassWrite.classList.Add(new ChildClassB());

// Serialize the class to a file
string filePath = Path.GetTempFileName() + ".xml";
XmlSerializer serializer = new XmlSerializer(typeof(CollectionClass));
TextWriter writer = new StreamWriter(filePath);
serializer.Serialize(writer, collectionClassWrite);
writer.Close();

XmlSerializer deserializer = new XmlSerializer(typeof(CollectionClass));

// Event handlers for unknown nodes and attributes -
serializer.UnknownNode += new
XmlNodeEventHandler(serializer_UnknownNode);
serializer.UnknownAttribute += new
XmlAttributeEventHandler(serializer_UnknownAttribute);

// Deserialize the class from the file
FileStream fs = new FileStream(filePath, FileMode.Open);
CollectionClass classCollectionOpen = (CollectionClass)serializer.Deserialize(fs);
fs.Close();

Console.ReadLine();
}

private static void serializer_UnknownAttribute(object sender, XmlAttributeEventArgs e)
{
Console.WriteLine($"Unknown Attribute at {e.LineNumber}:{e.LinePosition}");
}

private static void serializer_UnknownNode(object sender, XmlNodeEventArgs e)
{
Console.WriteLine($"Unknown Node at {e.LineNumber}:{e.LinePosition}");
}
}
}
Сгенерированный XML-код выглядит следующим образом:

Код: Выделить всё




1
2
3
4


1
2
5
6



События UnknownAttribute и UnknownNode срабатывают в (line:colum) 4:28 и 10:28, атрибуты xsi:type="ChildClassA" и xsi:type="ChildClassB".
Похоже, что эти события необходимо игнорировать, чтобы код работал.
Тогда у меня возникает вопрос:
Почему события возникают, когда XmlSerializer явно знает, как обращаться с XML-кодом?

Подробнее здесь: https://stackoverflow.com/questions/791 ... ializing-c
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»