Ho riscontrato alcuni comportamenti sorprendenti utilizzando XmlSerializer in C#. Considera il seguente pezzo di codice..NET XmlSerializer e classi nidificate in C#
public class A : IEnumerable
{
public class B
{
[XmlAttribute]
public string PropA { get; set; }
[XmlElement]
public string PropB { get; set; }
}
public IEnumerator GetEnumerator()
{
yield break;
}
}
class Program
{
static void Main (string[] args)
{
XmlSerializer serializer = new XmlSerializer(typeof(A.B));
XmlTextWriter writer = new XmlTextWriter(@"E:\temp\test.xml", Encoding.Default);
serializer.Serialize(writer, new A.B() { PropA = "one", PropB = "two" });
}
}
In questo esempio provo a serializzare un'istanza di a.b classe nidificata, che di per sé non fa uso della classe contenitore A in alcun modo. Ma quando tento di costruire il XmlSerializer per esso, il seguente viene generata un'eccezione:
InvalidOperationException è stata gestita:
Per essere XML serializzabile, tipi che ereditano da IEnumerable deve avere un'implementazione di Add (Sistema .Oggetto) a tutti i livelli della loro gerarchia di ereditarietà . Test.A non implementa Aggiungi (System.Object).
XmlSerializer sta tentando di applicare i vincoli di serializzazione a tipo A quando sto provando a serializzare il tipo A.B. Tuttavia, la mia comprensione è che oltre all'accesso privilegiato ai dati nelle istanze del tipo esterno, un tipo annidato non è speciale e si comporta come se fosse in uno spazio dei nomi.
Questa interpretazione non è corretta e fa la semantica dei tipi nidificati o XmlSerializer giustifica questo comportamento o sembra un bug in XmlSerializer?
In particolare per quanto riguarda la semantica XmlSerializer, esistono requisiti documentati che impongono i vincoli XmlSerializer su tutti i tipi esterni quando applicati a un tipo annidato?
Non si verifica un problema con i tipi nidificati. La tua classe A non ha una proprietà di tipo 'B'. –
Inoltre, non utilizzare 'new XmlTextWriter()'. Questo è stato deprecato da .NET 2.0. Usa invece 'XmlWriter.Create()'. –
Mi dispiace, ma tu hai perso completamente il punto della mia domanda. Non sto cercando di serializzare A, e non sto cercando di serializzare B come una proprietà di A. Sto provando a serializzarlo completamente indipendente da A. E sono consapevole della deprecazione di TextWriter. Questo è un esempio inventato dalla mia mente che ho cercato di mantenere breve. –