0

Salut J'ai la hiérarchie de classe suivante:DataContract et KnownTypes pour les classes héritées en utilisant Service Bus 1.0

public class SuperJob{ 
} 

public class JobA:SuperJob{ 
} 

public class JobB:SuperJob{ 
} 

Quand j'essaie de deserialise un SuperJob je reçois

Expecting element 'SuperJob' from namespace 'http://schemas.datacontract.org/2004/07/...'.. Encountered 'Element' with name 'JobA', namespace 'http://schemas.datacontract.org/2004/07/...'. 

J'ai annoté mes classes comme suit:

[DataContract] 
[KnownType(typeof(JobA))] 
[KnownType(typeof(JobB))] 
public class SuperJob{ 
} 

[DataContract] 
public class JobA:SuperJob{ 
} 

[DataContract] 
public class JobB:SuperJob{ 
} 

Vous ne savez pas ce que je fais mal? Des idées comment puis-je résoudre ce problème?

+0

J'ai modifié votre titre. S'il vous plaît voir, "[Les questions devraient inclure" tags "dans leurs titres?] (Http://meta.stackexchange.com/questions/19190/)", où le consensus est "non, ils ne devraient pas". –

+2

Veuillez poster votre code de désérialisation. –

+0

... Et le code de sérialisation aussi. –

Répondre

0

Managed pour résoudre ce problème, il y a un bogue dans la façon dont le bus de service instancie le sérialiseur. ressemble à l'interne, il instancie le sérialiseur avec JobA.getType(). La meilleure façon de faire est donc de créer votre propre objet DataSerializer qui utilise typeOf (JobA) et de le transmettre dans les deux cas lors de l'envoi du message sur le bus et de la lecture du bus.

0

Utilisez [ServiceKnownType] attribut sur votre service:

[ServiceKnownType(typeof(JobA))] 
[ServiceKnownType(typeof(JobB))] 
public interface IJobService 
{ 
.... methods 
} 

Another approach would be to pass knowntypes in DataContractSerializer constructor. 

List<Type> knownTypeList = new List<Type>(); 
knownTypeList.Add(typeof(JobA)); 
knownTypeList.Add(typeof(JobB)); 

// Create a DatatContractSerializer with the collection. 
DataContractSerializer ser2 = new DataContractSerializer(
            typeof(SuperJob), knownTypeList); 
Questions connexes