L’atsortingbut obsolète fait en sorte que la propriété soit ignorée par XmlSerialization

Je suis en train de refactoriser certains objects sérialisés au format XML, mais j’ai besoin de conserver quelques propriétés pour assurer la compatibilité avec les versions antérieures. J’ai une méthode qui convertit l’ancien object dans le nouveau et annule la propriété obsolète. Je souhaite utiliser l’atsortingbut Obsolete pour indiquer aux autres développeurs de ne pas utiliser cette propriété, mais la propriété est ignorée par XmlSerializer .

Code similaire:

 [Serializable] public class MySerializableObject { private MyObject _oldObject; private MyObject _anotherOldObject; private MyObject _newBetterObject; [Obsolete("Use new properties in NewBetterObject to prevent duplication")] public MyObject OldObject { get { return _oldObject; } set { _oldObject = value; } } [Obsolete("Use new properties in NewBetterObject to prevent duplication")] public MyObject AnotherOldObject { get { return _anotherOldObject; } set { _anotherOldObject = value; } } public MyObject NewBetterObject { get { return _anotherOldObject; } set { _anotherOldObject = value; } } } 

Des idées sur une solution de contournement? Ma meilleure solution est d’écrire obsolète dans les commentaires XML …

Mise à jour: j’utilise .NET 2.0

EDIT : Après avoir lu un article MS Connect , il semble que .Net 2.0 ait une «fonctionnalité» qui rend ObsoleteAtsortingbute équivalent à XmlIgnoreAtsortingbute sans aucune notification dans la documentation. Donc, je vais réviser ma réponse pour dire que la seule façon d’avoir votre gâteau et de le manger aussi dans ce cas-ci est de suivre les conseils de @ Will et d’ implémenter la sérialisation manuellement . Ce sera votre seul moyen pour l’avenir d’inclure des propriétés obsolètes dans votre XML. Ce n’est pas joli dans .Net 2.0, mais .Net 3.0+ peut vous simplifier la vie.

De XmlSerializer :

Les objects marqués avec l’atsortingbut obsolète ne sont plus sérialisés Dans .NET Framework 3.5, la classe XmlSerializer ne sérialise plus les objects marqués comme [obsolètes].

Une autre solution consiste à s’abonner à XmlSerializer.UnknownElement lors de la création du sérialiseur pour le type de données, puis à réparer les anciennes données de cette manière.

http://weblogs.asp.net/psteele/archive/2011/01/31/xml-serialization-and-the-obsolete-atsortingbute.aspx

Peut-être envisager d’avoir la méthode pour s’abonner en tant que méthode statique sur la classe pour le type de données.

 static void serializer_UnknownElement(object sender, XmlElementEventArgs e) { if( e.Element.Name != "Hobbies") { return; } var target = (MyData) e.ObjectBeingDeserialized; foreach(XmlElement hobby in e.Element.ChildNodes) { target.Hobbies.Add(hobby.InnerText); target.HobbyData.Add(new Hobby{Name = hobby.InnerText}); } } 

J’ai eu beaucoup de mal avec cela – il n’y a pas d’autre solution que de faire de la sérialisation manuellement ou d’utiliser un autre sérialiseur.

Cependant, au lieu d’écrire des shims pour chaque propriété obsolète qui devient rapidement pénible, vous pouvez envisager d’append un préfixe Obsolete aux noms de propriété (par exemple, Foo devient ObsoleteFoo . Cela ne générera pas d’avertissement du compilateur comme l’atsortingbut, mais au moins il est visible dans code.

1) WAG: essayez d’append le XmlAtsortingbuteAtsortingbute à la propriété; peut-être que cela remplacera l’atsortingbut obsolète
2) PITA: implémentez IXmlSerializable

Oui, je suis d’accord pour marquer les choses avec le nom “Obsolete”, nous faisons cela avec les valeurs Enum

 ///  /// Determines the swap file location for a cluster. ///  /// This enum contains the original text based values for backwards compatibility with versions previous to "8.1". public enum VMwareClusterSwapFileLocation { ///  /// The swap file location is unknown. ///  Unknown = 0, ///  /// The swap file is stored in the virtual machine directory. ///  VmDirectory = 1, ///  /// The swap file is stored in the datastore specified by the host. ///  HostLocal = 2, ///  /// The swap file is stored in the virtual machine directory. This value is obsolete and used for backwards compatibility. ///  [XmlElement("vmDirectory")] ObseleteVmDirectory = 3, ///  /// The swap file is stored in the datastore specified by the host. This value is obsolete and used for backwards compatibility. ///  [XmlElement("hostLocal")] ObseleteHostLocal = 4, } 

Vous pouvez essayer la solution suivante:

append une méthode nommée

 ShouldSerializeOldObject () { return true; } ShouldSerializeAnotherOldObject () { return true } 

cela peut remplacer l’atsortingbut obsolète