2014-05-19 1 views
0

Je suis de sérialisation C# classe suivante au format XMLEmitDefaultValue = false travailler uniquement pour les chaînes

[DataContract] 
public class LatLonPoint 
{ 
    [DataMember(IsRequired = true, Order = 1)] 
    public float Lat { get; set; } 

    [DataMember(IsRequired = true, Order = 2)] 
    public float Lon { get; set; } 

    [DataMember(EmitDefaultValue = false, Order = 3)] 
    public DateTime? OptimalTime { get; set; } 
} 

Quand je sérialiser cette classe en utilisant le code suivant

public static string GetLatLonPointXml(LatLonPoint data) 
{ 
    XmlSerializer xmlSerializer = new XmlSerializer(data.GetType()); 

    using (StringWriter stringWriter = new StringWriter()) 
    { 
    xmlSerializer.Serialize(stringWriter, data); 
    return stringWriter.ToString(); 
    } 
} 

Je reçois le résultat suivant

<?xml version="1.0" encoding="utf-16"?> 
<LatLonPoint xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Lat>30</Lat> 
    <Lon>-97</Lon> 
    <OptimalTime xsi:nil="true" /> 
</LatLonPoint> 

Pourquoi la sortie OptimalTime est-elle générée lorsque j'ai ajouté la valeur EmitDefaultValue à la valeur D ataMember attribut? J'ai réussi à faire fonctionner EmitDefaultValue avec des chaînes, mais rien d'autre. Merci beaucoup pour votre aide.

+0

Les attributs DataContract et DataMember sont destinés à être utilisés par DataContractSerializer. Je ne crois pas qu'ils sont respectés par le XMlSerializer. – Joe

+0

Merci Joe! C'était le problème. – Navcomp

Répondre

1

@ Joe: Merci! La modification de DataContractSerializer a résolu le problème. Maintenant, mon code sérialisation ressemble à ceci:

public static string GetXml(LatLonPoint data) 
{ 
    DataContractSerializer serializer = new DataContractSerializer(data.GetType()); 

    using (MemoryStream stream = new MemoryStream()) 
    { 
    serializer.WriteObject(stream, data); 
    byte[] bytes = stream.ToArray(); 
    return Encoding.UTF8.GetString(bytes, 0, bytes.Length); 
    } 
} 

La sortie XML est maintenant:

<LatLonPoint xmlns="http://schemas.datacontract.org/2004/07/Mnc.Service.Model.External" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <Lat>30</Lat> 
    <Lon>-97</Lon> 
</LatLonPoint> 

Merci Joe et Mr.EXE!

0

Essayez ceci:

[DataContractFormat] 

public class LatLonPoint 
{ 

    public float Lat { get; set; } 


    public float Lon { get; set; } 


    public DateTime? OptimalTime { get; set; } 
} 
+0

Merci pour la réponse. J'ai essayé ça et ça n'a pas marché. Joe a correctement identifié le problème dans le commentaire ci-dessus. J'utilisais XMLSerializer au lieu de DataContractSerializer. – Navcomp

Questions connexes