2012-02-25 1 views
1

J'essaie de désérialiser un flux XML dans un objet. Cela fonctionne parfaitement pour tous les domaines sauf un et je ne peux pas comprendre ce qui ne va pas dans ce domaine. Pour m'assurer de savoir de quoi je suis responsable, j'ai codé directement la chaîne XML.La désérialisation de XML ne fonctionne pas pour un champ

[DataContract(Name = "auth")] 
public class Authorization 
{ 
    [DataMember(Name = "status")] 
    public string Status { get; set; } 
    [DataMember(Name = "user_name")] 
    public string UserName { get; set; } 
    [DataMember(Name = "person_pk")] 
    public string PersonID { get; set; } 
} 

StringBuilder sb = new StringBuilder(); 
sb.Append("<auth xmlns=\"http://schemas.datacontract.org/2004/07/Veracross\">"); 
sb.Append("<status>success</status>"); 
sb.Append("<person_pk>2516</person_pk>"); 
sb.Append("<user_name>scohen</user_name>"); 
sb.Append("</auth>"); 

string fixedXMLData = sb.ToString(); 

DataContractSerializer serializer = new DataContractSerializer(typeof(Authorization)); 
MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(fixedXMLData)); 
Authorization Auth = (Authorization)serializer.ReadObject(stream); 

Lorsque je teste l'objet Auth après l'exécution, je trouve que Status et UserName sont correctement remplis. PersonID est nul. J'ai essayé de changer les noms de champs dans la chaîne XML, de réorganiser les champs, de changer le contenu du champ person_pk, etc. Rien ne le fait fonctionner.

Maintenant, voici où ça devient bizarre - Si je change «person_pk» pour «tester» partout, ça fonctionne très bien et j'ai la bonne valeur pour PersonID. Cependant, si je remplace "person_pk" par "person" ou "pk" cela ne fonctionne toujours pas? En réalité, j'obtiens cette chaîne XML d'un service RESTful et n'ai aucun contrôle sur le nommage des champs. Le champ s'appelle "person_pk", je n'arrive pas à comprendre pourquoi il ne sera pas désérialisé correctement.

Une idée?

Merci

LA SOLUTION: Je mis à jour mon DataMember attributs à inclure l'attribut de commande:

[DataContract(Name = "auth")] 
public class Authorization 
{ 
    [DataMember(Name = "status", Order=0)] 
    public string Status { get; set; } 
    [DataMember(Name = "person_pk", Order=1)] 
    public string PersonID { get; set; } 
    [DataMember(Name = "user_name", Order=2)] 
    public string UserName { get; set; } 
} 

Répondre

0

Changer l'ordre des champs dans un fichier XML afin que person_pk vient avant état:

sb.Append("<auth xmlns=\"http://schemas.datacontract.org/2004/07/Veracross\">"); 
sb.Append("<person_pk>2516</person_pk>"); 
sb.Append("<status>success</status>"); 
sb.Append("<user_name>scohen</user_name>"); 
sb.Append("</auth>"); 

DataSeri alizer considère également les champs

MISE À JOUR: Vous pouvez être intéressé par cette discussion: Ignore field order in DataContractSerializer

+0

En fait, je ne peux pas changer l'ordre des champs dans la chaîne XML que je reçois que d'un service que je ne contrôle pas. Toutefois, l'annonce que vous avez pointée a pointé vers un article MSDN qui avait la réponse. J'ai mis à jour ma question pour inclure la réponse. Merci – BKahuna

Questions connexes