Domanda

Creare una classe (lo chiamano FormElement). Quella classe dovrebbe avere alcune proprietà come i metadati che hanno con elementi di dati (nome, numero di sequenza, valore che è solo una stringa, ecc).

Questa classe ha come attributi di tipo Validation Application Block classi di convalida.

Voglio serializzare a XML e deserializzare esso. Verificare che tutte le proprietà della classe tra cui gli attributi di blocco applicazione convalida sopravvivono serializzazione.

qualche suggerimento?

Nessuna soluzione corretta

Altri suggerimenti

Il framework .NET ha questo costruito in, utilizzando C # si dovrebbe fare in questo modo:

// This code serializes a class instance to an XML file:
XmlSerializer xs = new XmlSerializer(typeof(objectToSerialize));

using (TextWriter writer = new StreamWriter(xmlFileName))
{
     xs.Serialize(writer, InstanceOfObjectToSerialize);
} 

E questo frammento è un esempio di come deserializzare un file XML di nuovo a un'istanza di classe:

// this code creates a class instance from the file we just made:
objectToSerialize newObject;
XmlSerializer xs = new XmlSerializer(typeof(objectToSerialize));

using (TextReader reader = new StreamReader(xmlFileName))
{
    newObject = (ObjectToSerialize) xs.Deserialize(reader);
}

È necessario contrassegnare la classe con l'attributo [Serializable] per questi funzionino. Se si desidera rendere il vostro output XML un po 'più bella, è possibile usare [XmlElement] e [XmlAttribute] attributi sulle vostre proprietà di classe di averli serializzare nel vostro schema della scelta.

Dicendo serializzare, vuoi dire utilizzare il meccanismo di serializzazione ufficiale, o di ottenere un effetto simile?

Se gli oggetti sono i fagioli, è possibile utilizzare la riflessione di scrivere un servizio generale che prende una classe e scrive il suo nome e le proprietà della classe. Si può leggere in modo simile i materiali da XML e generare l'oggetto (che è ciò che Apache digestore fa essenzialmente).

Che cosa ha detto Jonathon Olanda.

Tuttavia, è chiesto anche di convalida. Se si utilizza il codice di Jonathan registrato, tutte le tue proprietà serializzare e de-serializzare correttamente. Ma se si vuole veramente a controllare, c'è una proprietà si può impostare con il vostro oggetto XmlSerializer per uno schema XSD * per convalidare contro. È possibile creare lo schema abbastanza facilmente dal tuo classe utilizzando lo strumento xsd.exe della riga di comando che è incluso in Visual Studio.

Inoltre, suona come si potrebbe desiderare di controllare se alcune proprietà della vostra classe vengono serializzati come attributi o elementi. Jonathon toccato su questo, ma voglio mostrare un esempio:

[Serializable]
public class FormElement
{
   [XmlAttribute]
   public string Name {get; set;};

   [XmlAttribute]
   public int Sequence {get; set;};

   [XmlAttribute]
   public string Value {get; set;};

   [XmlElement]
   public Validation OnValidate{get; set;}

   [NonSerialized]
   public string UnimportantProperty {get; set;};

}

Infine, il tipo per ogni proprietà che si desidera serializzare deve essere anche serializzabile, e tipi complicati devono essere serializzati come XmlElements. In caso contrario, non sarà in grado di farlo.

xstream è una buona libreria Java per fare proprio questo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top