2016-01-13 41 views
0

我正在尝试使用SHA1加密许多第三方类对象。这些类对象正在从服务引用中消耗,并且不受我管理。虽然我可以查看和查看服务参考中的代码,但我无法更改代码。序列化SHA1加密对象时出现DataContractSerializer错误

一个需求是在通过SOAP发送它们之前计算这些类对象的SHA1哈希值。为此,我正在使用在http://alexmg.com/compute-any-hash-for-any-object-in-c/处找到的对象扩展。

但是,当我尝试使用computerHash<T>方法中的DataContractSerializer序列化其中一个类时,我收到以下错误。然而,我可以使用XmlSerializer将这个相同的类序列化为一个XML文档,而不会有任何问题。

类型'[namespace]。[class]。[method]'与数据契约名'[方法]:http://schemas.datacontract.org/2004/07/[namespace].[class]'不是预期的。考虑使用DataContractResolver或将任何不知道的类型静态添加到已知类型列表中 - 例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中。

任何有关使此工作的指导将非常感激。

回答

0

我发现this的StackOverflow职位从若干年前害得我一个old blog post,并试图通过NetDataContractSerializer代替DataContractSerializer的实施从博客解决方案1。现在的代码似乎没有抛出任何异常工作。

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; 
    } 
} 
相关问题