2011-12-02 17 views
6

en mi aplicación Silverlight 4, I serializar/deserializar los datos con DataContractSerializer. Puedo tener dos tipos de datos diferentes: The EditorModel y ConfiguratorModel. Ambos modelos heredan de una clase base común.Deserializar clase heredada con DataContractSerializer (typeof (BaseClass))

[DataContract(IsReference = true, Name = "ServiceModel", Namespace = "ServiceModeller.DataModel.Serialization")] 
[KnownType(typeof(DTO_ServiceModelEditor))] 
[KnownType(typeof(DTO_ServiceModelConfigurator))] 
public abstract class DTO_ServiceModelBase { ... } 

[DataContract(IsReference = true, Name = "ServiceModelEditor", Namespace = "ServiceModeller.DataModel.Serialization")] 
public class DTO_ServiceModelEditor : DTO_ServiceModelBase { ... } 

[DataContract(IsReference = true, Name = "ServiceModelConfigurator", Namespace = "ServiceModeller.DataModel.Serialization")] 
public class DTO_ServiceModelConfigurator : DTO_ServiceModelBase { ... } 

Serializar no es ningún problema y funciona como se esperaba. Cuando me deserializo, no quiero nombrar la clase heredada específica, porque el usuario también puede cargar EditorModel o ConfiguratorModel. Encontré this stackoverflowquestion, respondido por Marc Gravell, y según tengo entendido, puedo usar la clase base cuando conoce los tipos heredados (lo que hace, consulte la KnownType-Declaration en DTO_ServiceModelBase).

Aún así, cuando lo haga la siguiente deserialización (I también añaden ambos tipos heredados como el segundo parámetro):

DataContractSerializer serializer = new DataContractSerializer(typeof(DTO_ServiceModelBase), new Type[] {typeof(DTO_ServiceModelEditor), typeof(DTO_ServiceModelConfigurator)}); 
System.Xml.XmlReader reader = System.Xml.XmlReader.Create(new System.IO.StringReader(stream)); 
// stream is the serialized string 

object result; 
try 
{ 
    result = serializer.ReadObject(reader); 
} 
catch (Exception ex) 
{ .. } 

lanza una excepción, porque espera "ServiceModel" pero se encontró "ServiceModelEditor". ¿Hay algo que olvidé, o recibí la respuesta de Marc equivocada?

Gracias de antemano,
Frank

Respuesta

5

¿Cómo estás la serialización? Cuando esté serializando, tendrá que especificar que está escribiendo objetos de la clase base DTO_ServiceModelBase y luego debería funcionar. Así que cuando estás serialising simplemente definir el DataContractSerialiser la misma manera que en el ejemplo deserialización:

DataContractSerializer serializer = new DataContractSerializer(typeof(DTO_ServiceModelBase), new Type[] {typeof(DTO_ServiceModelEditor), typeof(DTO_ServiceModelConfigurator)}); 

Desde el error parece que usted ha hecho algo como esto en su lugar:

DataContractSerializer serializer = new DataContractSerializer(typeof(DTO_ServiceModelEditor)); 
+1

Esto debería han sido marcados como la respuesta correcta. –

Cuestiones relacionadas