c# - tag - El atributo obsoleto hace que la propiedad sea ignorada por XmlSerialization
tag c# (6)
1) WAG: intente agregar XmlAttributeAttribute a la propiedad; quizás esto anulará la ObsoleteAttribute
2) PITA: Implementar IXmlSerializable
Estoy refabricando algunos objetos que se serializan en XML, pero necesito mantener algunas propiedades para compatibilidad con versiones anteriores, tengo un método que convierte el objeto antiguo en el nuevo para mí y anula la propiedad obsoleta. Quiero usar el atributo Obsolete
para decirles a otros desarrolladores que no usen esta propiedad, pero está causando que la propiedad sea ignorada por XmlSerializer
.
Código similar:
[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; }
}
}
¿Alguna idea sobre una solución alternativa? Mi mejor solución es escribir obsoletos en los comentarios de XML ...
Actualización: estoy usando .NET 2.0
Puede probar la siguiente solución alternativa:
agregar un método llamado
ShouldSerializeOldObject ()
{
return true;
}
ShouldSerializeAnotherOldObject ()
{
return true
}
esto puede anular el atributo obsoleto
EDITAR : después de leer un artículo de MS Connect , parece que .Net 2.0 tiene una ''característica'' donde hace que ObsoleteAttribute sea equivalente a XmlIgnoreAttribute sin ninguna notificación en la documentación. Así que voy a revisar mi respuesta para decir que la única forma de tener tu pastel y comértela en este caso es seguir el consejo de @ Will e implementar la serialización manualmente . Esta será la única forma de prueba futura de incluir propiedades obsoletas en su XML. No es bonito en .Net 2.0, pero .Net 3.0+ puede hacer la vida más fácil.
Desde XmlSerializer :
Los objetos marcados con el Atributo obsoleto ya no se serializan. En .NET Framework 3.5, la clase XmlSerializer ya no serializa los objetos que están marcados como [Obsoleto].
Otra solución consiste en suscribirse a XmlSerializer.UnknownElement, al crear el serializador para el tipo de datos, y luego corregir los datos antiguos de esa manera.
http://weblogs.asp.net/psteele/archive/2011/01/31/xml-serialization-and-the-obsolete-attribute.aspx
Tal vez considere tener el método para suscribirse como método estático en la clase para el tipo de datos.
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});
}
}
He luchado mucho con esto: no hay otra solución que no sea la serialización manual o el uso de otro serializador.
Sin embargo, en lugar de escribir cuñas para cada propiedad obsoleta que rápidamente se convierte en un dolor, podrías considerar agregar un prefijo Obsolete
a los nombres de propiedad (por ejemplo, Foo
convierte en ObsoleteFoo
. Esto no generará una advertencia del compilador como el atributo, pero al menos es visible en código.
Sí, estoy de acuerdo con marcar cosas con el nombre "Obsoleto", hacemos esto con los valores de Enum
/// <summary>
/// Determines the swap file location for a cluster.
/// </summary>
/// <remarks>This enum contains the original text based values for backwards compatibility with versions previous to "8.1".</remarks>
public enum VMwareClusterSwapFileLocation
{
/// <summary>
/// The swap file location is unknown.
/// </summary>
Unknown = 0,
/// <summary>
/// The swap file is stored in the virtual machine directory.
/// </summary>
VmDirectory = 1,
/// <summary>
/// The swap file is stored in the datastore specified by the host.
/// </summary>
HostLocal = 2,
/// <summary>
/// The swap file is stored in the virtual machine directory. This value is obsolete and used for backwards compatibility.
/// </summary>
[XmlElement("vmDirectory")]
ObseleteVmDirectory = 3,
/// <summary>
/// The swap file is stored in the datastore specified by the host. This value is obsolete and used for backwards compatibility.
/// </summary>
[XmlElement("hostLocal")]
ObseleteHostLocal = 4,
}