Per esempio io ho classe per serializzareattributi obbligatori di serializzazione XML
[Serializable]
class Person
{
[XmlAttribute("name")]
string Name {get;set;}
}
ho bisogno di fare attributo Name richiesto. Come farlo in .NET?
Per esempio io ho classe per serializzareattributi obbligatori di serializzazione XML
[Serializable]
class Person
{
[XmlAttribute("name")]
string Name {get;set;}
}
ho bisogno di fare attributo Name richiesto. Come farlo in .NET?
Prima di tutto, [Serializable]
non viene utilizzato dal serializzatore XML.
Secondo, non c'è modo di renderlo necessario.
Credo che tu stia confondendo XML con un XSD. Se si desidera che la proprietà abbia sempre un valore, inizializzare questa proprietà nel costruttore e generare un'eccezione se qualcuno tenta di impostarlo su vuoto o nullo.
class Person
{
private string _Name = "Not Initialized";
[XmlAttribute("name")]
string Name {
get { return _Name;}
set {
if(value == null || value==string.Empty) throw new ArgumentException(...);
_Name = value;
}
}
}
-1: la classe persona non è serializzabile in XML perché non ha un costruttore pubblico senza parametri. Correggilo e rimuoverò il downvote. –
Questo non funzionerà. Tale costruttore non verrà mai utilizzato con la serializzazione, quindi anche il name setter non verrà chiamato. – darja
Il modo migliore per risolvere questo è di avere un XSD separato che si utilizza per convalidare il codice XML prima di passare sul XmlSerializer
. Il modo più semplice per lavorare con XSD e XmlSerializer
è iniziare con un XSD, generate the code for the XmlSerializer
from this XSD e also use it to validate the XML.
È possibile utilizzare lo XmlIgnoreAttribute
insieme al modello <FieldName>Specified
per generare un'eccezione se la proprietà viene lasciata vuota o nulla. Durante la serializzazione verrà verificata la proprietà NameSpecified
per determinare se il campo debba essere sottoposto a rendering, quindi se le proprietà Name lasciate nulle o vuote vengono lanciate delle eccezioni.
class Person
{
[XmlElement("name")]
string Name { get; set; }
[XmlIgnore]
bool NameSpecified
{
get {
if(String.IsNullOrEmpty(Name)) throw new AgrumentException(...);
return true;
}
}
}
Questa dovrebbe essere la risposta accettata. – ajawad987
È possibile utilizzare questo:
[XmlElement(IsNullable = false)]
Cosa vuoi dire? Cosa vuoi esattamente che succeda? – SLaks