2010-03-26 2 views
2

J'ai un fichier XML que j'essaie de sérialiser dans un objet. Certains éléments sont ignorés.La sérialisation des contrats de données ne fonctionne pas pour tous les éléments

Mon fichier XML:

<?xml version="1.0" encoding="utf-8" ?> 
<License xmlns="http://schemas.datacontract.org/2004/07/MyApp.Domain"> 
<Guid>7FF07F74-CD5F-4369-8FC7-9BF50274A8E8</Guid> 
<Url>http://www.gmail.com</Url> 
<ValidKey>true</ValidKey> 
<CurrentDate>3/1/2010 9:39:28 PM</CurrentDate> 
<RegistrationDate>3/8/2010 9:39:28 PM</RegistrationDate> 
<ExpirationDate>3/8/2099 9:39:28 PM</ExpirationDate> 
</License> 

Ma définition de la classe:

[DataContract] 
public class License 
{ 
    [DataMember] 
    public virtual int Id { get; set; } 
    [DataMember] 
    public virtual string Guid { get; set; } 
    [DataMember] 
    public virtual string ValidKey { get; set; } 
    [DataMember] 
    public virtual string Url { get; set; } 
    [DataMember] 
    public virtual string CurrentDate { get; set; } 
    [DataMember] 
    public virtual string RegistrationDate { get; set; } 
    [DataMember] 
    public virtual string ExpirationDate { get; set; } 
} 

Et ma sérialisation tentative:

XmlDocument Xmldoc = new XmlDocument(); 
Xmldoc.Load(string.Format(url)); 

string xml = Xmldoc.InnerXml; 
var serializer = new DataContractSerializer(typeof(License)); 
var memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(xml)); 
License license = (License)serializer.ReadObject(memoryStream); 
memoryStream.Close(); 

Les éléments suivants sont sérialisés:

  • guid
  • ValidKey

Les éléments suivants ne sont pas sérialisés:

  • Url
  • CurrentDate
  • RegistrationDate
  • ExpirationDate

Le remplacement des dates de chaîne dans le fichier xml par "blah" ne fonctionne pas non plus. Ce qui donne?

+0

BTW, il serait probablement plus rapide de désérialiser 'XmlDoc.CreateNavigator(). ReadSubtree()'. Cela vous renverra un XmlReader sur votre document. –

+0

Merci John, je vais vérifier ça! – splatto

Répondre

5

DataContractSerializer requiert que les éléments XML représentant les propriétés soient dans l'ordre alphabétique. Ainsi, votre XML devrait être:

<?xml version="1.0" encoding="utf-8" ?> 
<License xmlns="http://schemas.datacontract.org/2004/07/MyApp.Domain"> 
    <CurrentDate>3/1/2010 9:39:28 PM</CurrentDate> 
    <ExpirationDate>3/8/2099 9:39:28 PM</ExpirationDate> 
    <Guid>7FF07F74-CD5F-4369-8FC7-9BF50274A8E8</Guid> 
    <RegistrationDate>3/8/2010 9:39:28 PM</RegistrationDate> 
    <Url>http://www.gmail.com</Url> 
    <ValidKey>true</ValidKey> 
</License> 

L'exception, comme John l'a souligné, si vous utilisez la propriété de la commande sur votre DataMember attributs. Dans ce cas, les éléments XML doivent être dans l'ordre spécifié.

+0

@Aaron: merci de mentionner l'ordre alphabétique. Je ne le savais pas. Je vous suggère d'ajouter l'utilisation de la propriété 'Order' à votre réponse. –

+0

Salut John - pour répondre à votre question initiale, j'avais essayé de les réarranger. J'ai utilisé la solution d'Aaron et j'ai ajouté l'attribut Order pour aider à sauvegarder les modifications d'une personne sans le vouloir à l'avenir. Merci à vous deux – splatto

Questions connexes