2016-01-13 76 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; 
    } 
} 
相關問題