为 SHA1 加密序列化对象时出现 DataContractSerializer 错误
DataContractSerializer error when serializing a object for SHA1 encryption
我正在尝试使用 SHA1 加密一些第三方 class 对象。这些 class 对象正在从服务引用中使用,并且不受我管理。虽然我可以查看和查看服务参考中的代码,但我无法更改代码。
一个要求是在通过 SOAP 发送这些 class 对象之前计算它们的 SHA1 散列。为此,我目前正在使用 http://alexmg.com/compute-any-hash-for-any-object-in-c/.
中的对象扩展
但是,当我尝试使用 computerHash<T>
方法中的 DataContractSerializer
序列化其中一个 class 时,我收到以下错误。但是,我可以使用 XmlSerializer
将相同的 class 序列化为 XML 文档而不会出现任何问题。
Type '[namespace].[class].[method]' with data contract name '[method]:http://schemas.datacontract.org/2004/07/[namespace].[class]' is not expected. Consider a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.
如能提供有关使其正常工作的任何指导,我们将不胜感激。
我找到 this Whosebug post from a number of years ago which led me to an 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;
}
}
我正在尝试使用 SHA1 加密一些第三方 class 对象。这些 class 对象正在从服务引用中使用,并且不受我管理。虽然我可以查看和查看服务参考中的代码,但我无法更改代码。
一个要求是在通过 SOAP 发送这些 class 对象之前计算它们的 SHA1 散列。为此,我目前正在使用 http://alexmg.com/compute-any-hash-for-any-object-in-c/.
中的对象扩展但是,当我尝试使用 computerHash<T>
方法中的 DataContractSerializer
序列化其中一个 class 时,我收到以下错误。但是,我可以使用 XmlSerializer
将相同的 class 序列化为 XML 文档而不会出现任何问题。
Type '[namespace].[class].[method]' with data contract name '[method]:http://schemas.datacontract.org/2004/07/[namespace].[class]' is not expected. Consider a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.
如能提供有关使其正常工作的任何指导,我们将不胜感激。
我找到 this Whosebug post from a number of years ago which led me to an 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;
}
}