Kan ek nie deserialize met XmlSerializer in C # as 'n element is nie gevind nie?
-
06-07-2019 - |
Vra
Ek gebruik XmlSerializer te skryf en lees 'n voorwerp om xml in C #. Ek gebruik tans die eienskappe XmlElement
en XmlIgnore
om die serialisasie van die voorwerp te manipuleer.
As my xml lêer ontbreek 'n XML-element wat ek nodig het, my voorwerp deserializes nog (xml -> voorwerp) net mooi. Hoe kan ek aantoon (verkieslik via eienskappe) wat 'n sekere veld is "nodig"?
Hier is 'n voorbeeld metode van wat ek tans gebruik van:
[XmlElement(ElementName="numberOfWidgets")]
public int NumberThatIsRequired {
set ...;
get ...;
}
My ideale oplossing sou wees om iets soos 'n XmlRequired
kenmerk voeg.
Ook, is daar 'n goeie verwysing vir watter eienskappe is beskikbaar vir die gedrag van XmlSerializer manipuleer?
Oplossing
Ek het 'n antwoord vir die tweede deel het: "eienskappe wat beheer XML serialisasie" .
ondersoek nog die eerste deel ...
EDIT: ek sterk vermoed dat jy kan dit nie doen deur XML deserialization self. Ek het net hardloop xsd.exe op 'n monster skedule wat 'n vereiste eienskap sluit - en dit is presies dieselfde as die kenmerk is gemerk as opsioneel. As daar 'n manier om te vereis eienskappe om in te lê, sou ek verwag dat dit in so 'n geval uit te voer.
Ek vermoed dat jy basies het om net jou boom van voorwerpe te bekragtig nadat deserializing dit. Jammer oor dat ...
Ander wenke
Die enigste manier wat ek gevind het om dit te doen is deur middel van XSD. Wat jy kan doen is om te bevestig terwyl jy deserialize:
static T Deserialize<T>(string xml, XmlSchemaSet schemas)
{
//List<XmlSchemaException> exceptions = new List<XmlSchemaException>();
ValidationEventHandler validationHandler = (s, e) =>
{
//you could alternatively catch all the exceptions
//exceptions.Add(e.Exception);
throw e.Exception;
};
XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas.Add(schemas);
settings.ValidationType = ValidationType.Schema;
settings.ValidationEventHandler += validationHandler;
XmlSerializer serializer = new XmlSerializer(typeof(T));
using (StringReader sr = new StringReader(xml))
using (XmlReader books = XmlReader.Create(sr, settings))
return (T)serializer.Deserialize(books);
}
Vir rekbaarheid redes, XmlSerializer
is baie vergewensgesind wanneer dit kom by deserialization; dinge soos [DefaultValue]
, ShouldSerialize{Foo}
en {Foo}Specified
is hoofsaaklik gebruik tydens serialisasie (die uitsondering {Foo}Specified
, wat is ingestel tydens deserialization asook bevraagteken tydens serialisasie).
As sodanig; daar is nie 'n maklike manier om dit te doen, tensy jy IXmlSerializable
implementeer en dit self te doen. damagednoob toon 'n XSD opsie, wat ook 'n opsie.