Пример кода:
Код: Выделить всё
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}");
}
}
}
Код: Выделить всё
1
2
3
4
1
2
5
6
Похоже, что эти события необходимо игнорировать, чтобы код работал.
Тогда у меня возникает вопрос:
Почему события возникают, когда XmlSerializer явно знает, как обращаться с XML-кодом?
Подробнее здесь: https://stackoverflow.com/questions/791 ... ializing-c
Мобильная версия