2009-01-09 7 views
6

Quel est le moyen le plus simple pour que XmlSerializer sérialise également les propriétés privées et "public const" d'une classe ou d'une structure? Ce n'est pas tout ce qui sortira pour moi, ce sont des choses qui ne sont que publiques. Le rendre privé ou ajouter const fait que les valeurs ne soient pas sérialisées.Utilisation de XmlSerializer avec des propriétés const publiques et privées

+1

Pourquoi vous voulez constantes être sérialisé ?! Vous semblez faire une mauvaise route. –

+0

Par définition, les constantes exposées (c'est-à-dire publiques et protégées) sont quelque chose qui ne changera jamais. Changer une constante publique est un changement de client cassant! Pour quelque chose qui est simplement constant pour l'exécution de l'application, ou pour une version particulière de l'application, mais qui peut changer dans le futur, vous devez utiliser les champs 'readonly'. 'XmlSerializer' ne les traitera pas non plus, mais c'est une question différente. –

+0

Si vous souhaitez sérialiser/désérialiser des membres privés, veuillez consulter http://stackoverflow.com/questions/420662/can-an-internal-setter-of-a-property-be-serialized –

Répondre

15

XmlSerializer recherche uniquement dans les zones publiques et les propriétés. Si vous avez besoin de plus de contrôle, vous pouvez implémenter IXmlSerializable et sérialiser ce que vous voulez. Bien sûr, sérialiser une constante n'a pas beaucoup de sens puisque vous ne pouvez pas désérialiser en une constante.

3

Découvrez DataContractSerializer, présenté dans .NET 3.0. Il utilise également le format XML et, à bien des égards, il est meilleur que XmlSerializer, y compris en traitant des données privées. Voir http://www.danrigsby.com/blog/index.php/2008/03/07/xmlserializer-vs-datacontractserializer-serialization-in-wcf/ pour une comparaison complète.

Si vous avez seulement .NET 2.0, il y a le BinarySerializer qui peut traiter des données privées, mais bien sûr c'est un format binaire.

+0

'Better' est discutable, par exemple , le DataContractSerializer ne vous donne aucune flexibilité sur la façon dont l'objet est sérialisé. – nicodemus13

2

Cela n'a aucun sens de prendre en compte const membres, car ils ne sont pas par instance; mais si vous voulez simplement dire des membres d'instances non publiques: considérez DataContractSerializer (.NET 3.0) - ceci est similaire à XmlSerializer, mais peut sérialiser des propriétés non publiques (bien que ce soit "opt in").

Voir here for more.

+2

La sérialisation de la valeur d'une constante pour un temps d'exécution particulier est très logique, si par exemple elle doit être comparée à la valeur d'une autre exécution. – Grault

+0

@Jesdisciple pas vraiment - car encore une fois: c'est un sérialiseur d'objet (instance) - et cette valeur n'appartient pas à l'objet (instance). –

9

Même si il est impossible de sérialisation des propriétés privées, vous pouvez sérialiser propriétés avec un setter interne, comme celui-ci:

public string Foo { get; internal set; } 

Pour ce faire, vous avez besoin d'effectuer une pré-générer l'ensemble de sérialisation avec sgen. exe, et déclarer cette assemblée comme ami:

[assembly:InternalsVisibleTo("MyAssembly.XmlSerializers")] 
0

Une autre solution l'utilisation de Newtonsoft.Json:

var json = Newtonsoft.Json.JsonConvert.SerializeObject(new { root = result }); 
    var xml = (XmlDocument)Newtonsoft.Json.JsonConvert.DeserializeXmlNode(json); 

Bien sûr, celui-ci a malheureusement fait un détour via json.

0

Voici ma solution pour mettre les valeurs immuables dans une propriété qui sérialisation XML:

[XmlElement] 
public string format { get { return "Acme Order Detail XML v3.4.5"; } set { } } 
Questions connexes