2009-02-23 8 views
1

J'ai un ensemble de classes de gestion de configuration XML personnalisées dans .NET.Sérialiser/désérialiser vers/à partir de plusieurs fichiers de configuration XML

Il y a deux champs de configuration dans mon application:

utilisateur: le paramètre s'applique à l'utilisateur quel que soit le compte qu'elle est connecté à. Stocké dans un fichier de configuration XML dans le répertoire de l'utilisateur.

Utilisateur/compte: Le paramètre s'applique à l'utilisateur lorsqu'il est connecté à un compte particulier. Stocké dans un fichier de configuration XML dans le répertoire de l'utilisateur sous un sous-répertoire spécifique au compte.

Les deux documents XML ont la même structure et peuvent être modifiés manuellement. Lorsque l'application démarre, je lis la configuration XML du profil de l'utilisateur et la configuration XML du répertoire Utilisateur/Compte. Je fusionne ensuite les deux documents XML en un seul XDocument, puis je désérialise le XML en objets modélisés après les sections de XDocument. Si un paramètre Utilisateur/Compte est présent, il doit remplacer le paramètre Utilisateur. Exemple:

fichier utilisateur:

<FileSettings> 
    <DownloadPath>C:\downloads</DownloadPath> 
    <UploadPath>C:\uploads</UploadPath> 
</FileSettings> 

utilisateur/fichier de compte pour le compte XYZ:

<FileSettings> 
    <DownloadPath>C:\newlocation\xyz\mystuff</DownloadPath> 
</FileSettings> 

Résultat après fusion:

<FileSettings> 
    <DownloadPath>C:\newlocation\xyz\mystuff</DownloadPath> 
    <UploadPath>C:\uploads</UploadPath> 
</FileSettings> 

Dans l'exemple ci-dessus, un objet FileSettings avec 2 propriétés - DownloadPath et UploadPath sera instancié à partir de la section.

Voici mon problème: Je n'ai aucune idée du fichier de configuration (c'est-à-dire de la portée) dont proviennent le DownloadPath et le UploadPath. Par conséquent, lorsque l'objet doit à nouveau sérialiser, il ne sait pas quelles propriétés vont dans quel fichier. Quelle est la meilleure façon de stocker la "source", propriété par propriété, de sorte que je puisse m'assurer qu'un paramètre est écrit dans le même fichier de configuration que celui où il a été lu?

Merci. Après la fusion, est-il possible d'ajouter la source de valeur de chaque propriété?

Répondre

2

<FileSettings> 
    <DownloadPath>C:\newlocation\xyz\mystuff</DownloadPath> 
    <UploadPath>C:\uploads</UploadPath> 
    <DownloadPathSrc>xyz</DownloadPathSrc> 
    <DownloadPathSrc>user</DownloadPathSrc> 
</FileSettings> 

Dans ce cas, les deux propriétés src peuvent être désérialisé dans votre FileSettings objet, Avant sérialisation de déposer à nouveau, vous pouvez créer une nouvelle marque objet FileSetting pour chacun de la source sans régler la * propriété src, par La chaîne vide par défaut ne sera pas sérialisée par XmlSerializer. Avec la propriété src, vous savez dans quel fichier l'objet que vous souhaitez sérialiser.

EDIT, Si vous souhaitez ajouter src comme attribut de l'élément. c'était en fait ma pensée initiale aussi, cependant, vous devez créer une classe pour chacune des propriétés. par exemple.pour DownloadPath propriété en classe FileSetting

[XmlType()] 
public class DownloadPath 
{ 
    [XmlAttribute] 
    public string Src; 
    [XmlText] 
    public string Text; 
} 
// serialize to 
<DownloadPath Src="...">text</DownloadPath> 
+0

C'était ma première pensée. J'allais faire C: \ path. Mais je n'étais pas sûr de savoir comment représenter cela dans l'objet une fois qu'il serait désérialisé. Je veux éviter d'avoir une propriété source correspondante pour chaque propriété de l'objet. –

+0

Existe-t-il un moyen de "décorer" chaque propriété avec un attribut source sous forme d'objet de la façon dont nous utilisons les attributs sur un élément XML? –

+0

vérifier la publication mise à jour, j'ai ajouté un commentaire pour src comme attribut. –

1

Je préférerais ajouter des propriétés à XML comme ceci:

<FileSettings> 
    <DownloadPath src="Account">C:\newlocation\xyz\mystuff</DownloadPath> 
    <UploadPath src="User">C:\uploads</UploadPath> 
</FileSettings> 

Il est plus facile à mettre en œuvre la couche de séparation du contenu.

Questions connexes