Compatibilidad con versiones anteriores de DataContractSerializer

Estoy tratando de deserializar desde una versión anterior de un objeto serializado, y aparece un error que no se espera elementNameX_backField, esperando el elemento newElementName_backingField. Así es como se ve mi código:

using (var fileStream = new FileStream(fullName, FileMode.Open))
                using (var decryptStream = new CryptoStream(fileStream, decryptor, CryptoStreamMode.Read))
                using (var reader = XmlDictionaryReader.CreateBinaryReader(decryptStream, XmlDictionaryReaderQuotas.Max))
                {

                    var ser = new DataContractSerializer(typeof(classA), KnownTypes);
                    rv = ser.ReadObject(reader) as classA;
                }
[DataContract]
public class classA
{
 [DataMember]
 public classB ClassBee {get; set;}
}
[Serializable]
public class ClassB
{
[XmlElement("element")]
public customType1 elementNameX{get; set;}
[XmlElement("newElement")]
public customType2 newElementName{get; set;}
}

¿Alguna idea sobre cómo podría hacer que ignore newElement si no existe en el archivo ya serializado?

preguntado el 22 de mayo de 12 a las 20:05

No sé, sin probar cosas aleatorias, una forma fácil de salir de eso, pero el principal problema aquí es que ClassB no es un contrato de datos con miembros de datos explícitos. Lo que lo hace más complicado. -

Además de lo que dijo @MarcGravell, los tipos [Serializables] tienen sus campos serializados por DataContractSerializer, no por sus propiedades, y todos los atributos [XmlElement] se ignoran (son aplicados por XmlSerializer, no por DataContractSerializer). -

classB es una clase de terceros, que tiene su propio esquema de serialización xml. Intentaré agregar el atributo DataContract a ClassB y veré si eso hace la diferencia. ¡Gracias! -

@Ladder IIRC se molestará por eso. Y realmente no ayudará con el problema de los campos. Dime... ¿Los tipos de aduanas son los mismos? ¿Son solo los nombres de los miembros los que han cambiado? ¿O los valores antiguo/nuevo no están relacionados? -

@LadderLogic, convierta los comentarios en la respuesta. -

1 Respuestas

Responda de los comentarios anteriores para la posteridad: agregar el atributo DataContract a ClassB solucionó este problema. Tanto la serialización XML como la DataContractSerialization funcionan ahora en esa ClaseB

Respondido 14 ago 18, 07:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.