2010-08-12 19 views
10

J'ai rencontré ce problème aujourd'hui et j'ai pu déterminer que, lors du nettoyage du code, R # ne convertirait pas les propriétés de champs de sauvegarde en propriétés auto dans les classes décorées avec SerializableAttribute, par exemple.Resharper ne convertit pas automatiquement en propriétés auto dans les classes Serializable - dois-je?

using System; 

namespace DataContracts 
{ 
    [Serializable] 
    public class Class1 
    { 
     private bool _wontChange; 

     public bool WontChange 
     { 
      get { return _wontChange; } 
      set { _wontChange = value; } 
     } 
    } 
} 

Le code ci-dessus ne sera pas modifié pendant le nettoyage automatique du code. Bien sûr, je peux le faire manuellement, et je reçois toujours l'option de menu d'action rapide de R # pour le faire au niveau de la propriété individuelle. Mais je me demande s'il y a un problème sous-jacent dont je ne suis pas conscient en utilisant les propriétés auto dans les classes [Serializable].

Dans le JetBrains forum thread nous sommes référés an issue dans lequel ce problème est discuté, mais il ne semble pas être définitivement résolu.

+0

Vous dites que vous pouvez utiliser le "menu d'action rapide" pour faire le travail. L'option est juste pas là. Et quand j'enlève l'attribut sérialisable, tout va bien. – Samuel

Répondre

11

Lorsque vous sérialisez des objets, les noms de champs commencent à importer, car la plupart des mécanismes de sérialisation utilisent les noms de champ pour restaurer les données sérialisées. Maintenant, lorsque vous modifiez le nom de champ, vous ne pouvez pas lire correctement les anciennes versions sérialisées.

Lorsque vous convertissez en propriétés automatiques, le champ de sauvegarde a un nom généré automatiquement, qui ne correspond pas à l'ancien nom. Par conséquent, cela introduirait un problème potentiel lors de la lecture des anciennes données sérialisées.

Je suppose que pour éviter ce piège, R # ne le change pas automatiquement en propriété auto si la classe est marquée comme sérialisable.

+0

Je suppose que cela ne serait pas un problème avec les objets qui ont été sérialisés et désérialisés à partir de la même DLL - les champs de sauvegarde seraient définis de manière statique dans la DLL. Est-ce une hypothèse valide? – arootbeer

+1

Je n'ai jamais rencontré ce problème décrit avec les propriétés auto et la sérialisation. J'ai lu le bug R # https://youtrack.jetbrains.com/issue/RSRP-63531 dedans et ce SO il n'y a pas de preuves fournies montrent cela en action? Où est le projet reproductible? Était-ce un problème en CLR1 et CLR2 jours était-il fixé dans une mise à jour CLR 2 ou CLR 4 plus tard? –

+0

Merci beaucoup. Ce serait bien que ce type de fonctionnalité soit documenté sur leur site web. – Samuel