0

Je tente de chiffrer un certain nombre d'objets de classe tierce à l'aide de SHA1. Ces objets de classe sont consommés à partir de références de service et ne sont pas gérés par moi. Bien que je puisse voir et examiner le code dans la référence de service, je suis incapable d'apporter des modifications au code.Erreur DataContractSerializer lors de la sérialisation d'un objet pour le chiffrement SHA1

Une exigence est de calculer le hachage SHA1 sur ces objets de classe avant de les envoyer via SOAP. Pour ce faire, j'utilise actuellement les extensions d'objets trouvées au http://alexmg.com/compute-any-hash-for-any-object-in-c/.

Cependant, lorsque j'essaie de sérialiser l'une des classes en utilisant le DataContractSerializer dans la méthode computerHash<T>, l'erreur suivante s'affiche. Je peux, cependant, sérialiser cette même classe en utilisant le XmlSerializer à un document XML sans aucun problème.

Le type '[espace de noms]. [Classe]. [Méthode]' avec le nom du contrat de données '[méthode]: http://schemas.datacontract.org/2004/07/[namespace].[class]' n'est pas prévu. Considérez un DataContractResolver ou ajoutez des types non connus de manière statique à la liste des types connus, par exemple, en utilisant l'attribut KnownTypeAttribute ou en les ajoutant à la liste des types connus transmis à DataContractSerializer.

Toutes les instructions pour que cela fonctionne seront grandement appréciées.

Répondre

0

J'ai trouvé this après StackOverflow il y a un certain nombre d'années qui me conduit à une old blog post et a essayé la mise en œuvre Solution 1 de ce blog en utilisant le NetDataContractSerializer au lieu du DataContractSerializer. Le code semble maintenant fonctionner sans lancer d'exception.

private static byte[] computeHash<T>(object instance, T cryptoServiceProvider) where T : HashAlgorithm, new() 
{ 
    // Original Code using DataContractSerializer throws an Exception. 
    //DataContractSerializer serializer = new DataContractSerializer(instance.GetType()); 

    // Use the following instead of the above in order to avoid Exception being thrown. 
    NetDataContractSerializer serializer = new NetDataContractSerializer(); 

    using (MemoryStream memoryStream = new MemoryStream()) 
    { 
     serializer.WriteObject(memoryStream, instance); 
     cryptoServiceProvider.ComputeHash(memoryStream.ToArray()); 
     return cryptoServiceProvider.Hash; 
    } 
}