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?

Was dit nuttig?

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.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top