10
votes

Système.uri implémente isherialisable, mais donne une erreur?

Duplicaté possible: strong>

Comment (XML) Serialize A URI P>

à ma connaissance uri code> implémente isherialisable, mais jette une erreur lorsqu'il est utilisé comme celui-ci: p> xxx pré>

fonctionne juste si uri code> type est remplacé par chaîne code>. p>

Quelqu'un sait quel est le coupable? p>


solution proposée par anton gogolev em >: h2> xxx pré>

(merci pour SLAKS EM> indiquant également la frontière de ma méthode ...) p>

Ceci produit XML Sortie: P>

<Server>
    <URI>http://localhost/</URI>
    <Name>test</Name>
</Server>


0 commentaires

4 Réponses :


9
votes

Pour être sérialisé à XML, la classe URI doit avoir un constructeur sans paramètre, ce qui ne doit pas: uri est conçu pour être immuable. Honnêtement, je ne vois pas pourquoi il ne peut pas être sérialisé sans avoir un constructeur sans paramètre.

Pour contourner cela, changez URI Type de propriété sur String ou ajoutez une autre propriété appelée _uri , marque uri < / code> avec xmlignoreattribute et réécrire c'est obtenir méthode comme obtenez {retourne neuf uri (_uri); } .


1 commentaires

J'ai ajouté votre solution à la question, juste pour rendre le code visible ...



0
votes

Exceptions internes dit:

System.uri ne peut pas être sérialisé car il n'a pas de constructeur sans paramètre.

Une réponse simple est que vous ne pouvez pas sérialiser cela à XML.


0 commentaires

2
votes

Vous confondez la sérialisation binaire avec la sérialisation XML.

La sérialisation XML est un processus très simple qui enregistre les valeurs de champ et se restaure dans un nouvel objet.

La sérialisation binaire est beaucoup plus puissante et permet à l'objet de contrôler le comportement de sérialisation. interface iserializable , quel URI s'applique , n'est utilisé que pour la sérialisation binaire.


2 commentaires

C'est en effet le cas. Je pensais que l'Iséralisable signifie qu'il est sérialisable par tout sérieliseur (y compris XML). Mais je n'ai pas considéré cela comme une réponse à mon problème parce que mon problème réel était d'obtenir ce XML sérialisé.


Peut-être que je devrais changer le sujet, car cela concerne spécifiquement la sérialisation XML ...



9
votes

En réalité, la meilleure solution serait l'inverse - stocker la valeur dans une propriété URI et l'accéder à une chaîne.

Par exemple: P>

public class Server
{
    public string Name { get; set; }

    [XmlIgnore]
    public Uri Uri { get; set; }

    [XmlElement("URI")]
    public string UriString { 
        get { return Uri.ToString(); }
        set { Uri = new Uri(value); } 
    }
}


1 commentaires

Oui, c'est correct, merci pour ça! Cela ne vous dérange pas si je l'ai ajouté au code que j'ai écrit à la question.