Compatibilidad con versiones anteriores de DataContractSerializer
Frecuentes
Visto 593 veces
2
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?
1 Respuestas
1
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 c# wcf datacontractserializer or haz tu propia pregunta.
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. - Marc GravellAdemá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). - carlosfigueira
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! - LadderLogic
@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? - Marc Gravell
@LadderLogic, convierta los comentarios en la respuesta. - Michael Freidgeim