2015-03-16 5 views
0

Lorsque je copie la classe DataColumns dans la classe RatesOfPay, les attributs DataMember dans WCF ne sont plus respectés lorsque j'utilise le code suivant à copier. Je veux voir les résultats dans l'ordre Step8, Step9, Step10 mais j'obtiens Step10, Step8, Step9 car l'attribut Order est ignoré et les colonnes sont classées par ordre alphabétique. . De plus, l'attribut EmitDefaultValue = false est ignoré et je vois des étapes avec des valeurs nulles.Les attributs DataMember dans WCF ne sont pas honorés lorsque je copie de la liste à un autre

List<DataColumns> source = new List<DataColumns>(); 
List<RatesOfPay> destination = new List<RatesOfPay>(); 

destination = source.Select(d => new RatesOfPay 
{ 
    step8 = d.column8, 
    step9= d.column9, 
    step10 = d.column10 
}).ToList(); 

public class DataColumns 
{ 

    [DataMember(Order = 0, Name = "column8", EmitDefaultValue = false)] 
    public string column8 { get; set; } 

    [DataMember(Order = 1, Name = "column9", EmitDefaultValue = false)] 
    public string column9 { get; set; } 

    [DataMember(Order = 2, Name = "column10", EmitDefaultValue = false)] 
    public string column10 { get; set; } 
} 

public class RatesOfPay 
{ 

    [DataMember(Order = 0, Name = "Step8", EmitDefaultValue = false)] 
    public string step8 { get; set; } 

    [DataMember(Order = 1, Name = "Step9", EmitDefaultValue = false)] 
    public string step9 { get; set; } 

    [DataMember(Order = 2, Name = "Step10", EmitDefaultValue = false)] 
    public string step10 { get; set; } 
} 
+0

Je pense que vous ne comprenez pas à quoi sert 'DataMember'. Ce n'est pas pour commander les propriétés/champs dans un objet défini par l'utilisateur. Il est utilisé pour fournir des informations sur le membre à utiliser par 'DataContractSerializer'. Si vous regardez le résultat sérialisé (c'est-à-dire, XML), vous devriez voir Step8, Step9 et Step10. Si vous regardez dans le débogueur quand il est désérialisé, vous le verrez dans l'ordre alphabétique ASCII. – Tim

+0

De même, 'EmitDefaultValue' indique au sérialiseur d'émettre la valeur par défaut pour le type de données. C'est vrai par défaut. Lorsque vous le définissez sur false, toute propriété qui a une valeur nulle (ou une valeur par défaut pour les types de valeurs) ne sera pas sérialisée, mais elle le sera toujours dans l'objet. Jetez un oeil à [DataMemberAttribute Class] (https://msdn.microsoft.com/en-us/library/System.Runtime.Serialization.DataMemberAttribute (v = vs.110) .aspx) sur MSDN - il existe plusieurs exemples démontrer ce qu'est quoi - mais tout cela s'applique à ** la sérialisation **. – Tim

+0

Merci beaucoup pour votre commentaire. Le changer pour utiliser [XmlSerializerFormat] a fait l'affaire! – Raj

Répondre

1

Pour élargir mes commentaires, DataMember est utilisé pour charger le DataContractSerializer comment sérialiser un membre particulier.

Order indique au DataContractSerializer quel ordre linéariser/désérialiser le membre.

EmitDefaultValue indique au DataContractSerialzier ou non d'émettre les valeurs par défaut (null pour les types de référence, une valeur donnée pour les types de valeur) lors de la sérialisation. Si elle est définie sur false, null ne sera pas le résultat - le membre sera ommitted. C'est vrai par défaut.

Quelques exemples pourraient aider à illustrer ceci:

D'abord, la classe. Si vous regardez la classe dans le débogueur, les propriétés seront listées dans l'ordre alphabétique ASCII, ce qui signifie que l'étape 10 sera listée en premier. Alors va column10.

Si vous regardez le XML sérialisé, vous pouvez voir quelque chose comme ceci:

<column8>abcd</column8> 
<column9>defg</column9> 
<column10>hijk</column10> 

Si l'une des colonnes, dites column9, est une chaîne vide, vous verriez ce (avec EmitDefaultValue ensemble à false) quand il a été publié en feuilleton:

<column8>abcd</column8> 
<column10>zzzz</column10> 

EmitDefaultValue peut être un peu déroutant dans une perspective de nommage. Et il a des interactions vraiment amusantes avec IsRequired.