2009-10-14 10 views
5

Ho un contratto come segue:WCF DataContract - marcatura membro IsRequired = false

[DataContract] 
public class MyObj 
{ 
    [DataMember(IsRequired=true)] 
    public string StrA {get; private set;} 

    [DataMember(IsRequired=false)] 
    public string StrB {get; private set;} 
} 

cosa fa esattamente IsRequired significa? IsRequired=false significa che è possibile passare un'istanza di attraverso il filo con StrB unitializzato o significa che è possibile passare un'istanza di MyObj attraverso il filo con StrB assente?

Se in quest'ultimo caso, come faccio a istanziare + inviare attraverso un'istanza di MyObj senza StrB?

risposta

3

'IsRequired indica al motore di serializzazione se il valore di StrB deve essere presentato nell'XML sottostante.

Così via cavo è possibile ottenere <MyObj></MyObj> e deserializzare in un'istanza MyObj bene.

Modifica: non è possibile inizializzare un'istanza di MyObj senza che sia presente StrB. L'uso per questo è compatibilità ed estensibilità. Ad esempio, forse il client non ha la versione MyObj aggiornata e non ha StrB presente. In questo caso, il codice server può contrassegnare StrB come non richiesto e non ci sarà un'eccezione di serializzazione quando viene ricevuto un messaggio sul lato server.

+0

ok, quindi data la mia lezione di cui sopra potrei inviare attraverso abc - questo è quello che stai dicendo, giusto? In tal caso, come faccio a istanziare MyObj con StrA ma non con StrB .. ?? –

+0

Sì, è quello che sto dicendo. Non so se il tuo DataContract funzionerà comunque. Non sono sicuro che DataMember necessiti di getter/setter pubblico. Non puoi istanziare MyObj con StrA ma non StrB usando il codice sopra. Se crei un'altra versione di MyObj che non contiene StrB, potresti farlo. –

2

come faccio io in realtà un'istanza di + inviare attraverso un'istanza di MyObj senza STRB?

Come ho appena detto nel WCF and Anonymous Types, è possibile utilizzare [DataMember (EmitDefaultValue = false)]. Ciò assicurerà che quando il membro dati è al suo valore predefinito (ad esempio null per le stringhe), non verrà emesso.

Problemi correlati