2009-08-07 8 views
1

Dans notre application .NET, nous dépendons de la sérialisation binaire pour nos fichiers de projet d'application. Le fichier de classe de projet principal utilise la méthode suivante pour se sérialiser (notez que toutes les exceptions sont supprimées pour plus de clarté).Je ne peux pas lire ma propre sérialisation .NET

public void ProjectSerialize(string filename) 
    { 
     Stream s = File.Open(filename, FileMode.Create); 
     BinaryFormatter b = new BinaryFormatter(); 
     b.Serialize(s, this); 
    } 

La classe possède de nombreuses méthodes et propriétés qui sont stockées. Maintenant tout fonctionne bien, cependant quand nous voulons sortir une nouvelle version de l'application qui a une nouvelle version de la classe de projet, nous ne sommes plus compatibles avec les versions antérieures. Je sais que c'est une erreur de conception, puisque bien sûr j'ai dû utiliser ma propre sérialisation définie et je ne devrais pas dépendre de .NET pour ce type important de fichiers.

Maintenant, ma question, comment puis-je lire mes anciens fichiers de projets sérialisés? Y a-t-il un format que je devrais savoir, comment est-ce que .NET sérialisait en premier lieu? Je veux juste que mes clients soient compatibles avec l'ancien format de fichier, mais je ne sais pas comment écrire un convertisseur de fichiers pour les anciens fichiers de projets stockés.

Merci,

Erik

+0

Je ne peux pas lire ma propre écriture, non plus! : P – Cerebrus

Répondre

1

Un peu tard maintenant, mais peut-être que vous devriez lire sur Version Tolerant Serialization?

+0

+1, cela restaurera les champs des anciennes versions tout en vous aidant à éviter que des exceptions soient levées. Veillez à ce que seules les données de vos anciennes classes soient sérialisées, pas leurs méthodes. – Dabblernl

+0

Je lis juste ceci, cela devrait faire l'affaire !! Merci beaucoup RichardOD – Enrico

+0

Les contrats de données wcf ou les tampons google protocol (Jon ou Marcs) sont une solution beaucoup plus robuste. –

1

Avez-vous l'ancienne version de votre projet dans le contrôle de la source?

Si tel est le cas, je vous recommande de l'utiliser pour charger les données existantes, puis de les écrire d'une manière plus conviviale que votre nouveau code puisse lire avec succès.

BTW, vous devriez vraiment fermer le flux pour vous assurer que toutes les données sont rincée:

public void ProjectSerialize(string filename) 
{ 
    using (Stream s = File.Open(filename, FileMode.Create)) 
    { 
     BinaryFormatter b = new BinaryFormatter(); 
     b.Serialize(s, this); 
    } 
} 
+0

Salut Jon, Merci pour le commentaire et bien sûr je ferme le flux. Le problème est que l'application est déjà en cours d'exécution chez les clients et qu'il est impossible d'obtenir tous les fichiers d'eux. Ma première idée était de faire un petit convertisseur qui convertit les fichiers de projet plus anciens en de nouveaux fichiers contrôlés. Cependant, j'ai trouvé que seule une application avec le même nom que l'application originale peut lire les fichiers. – Enrico

+0

Il ne devrait pas avoir besoin d'être une application avec exactement le même nom, mais probablement lire d'un * assembly * avec le même nom. Vous pouvez donc créer un nouvel exécutable qui fait référence à une bibliothèque de classes portant le même nom qu'auparavant. Exportez-le dans un sous-répertoire différent en tant qu'outil de conversion. –

Questions connexes