0

Я пытаюсь зашифровать несколько сторонних объектов класса с использованием SHA1. Эти объекты класса потребляются из справочных служб и меня не контролируют. Хотя я вижу и просматриваю код в Service Reference, я не могу вносить изменения в код.Ошибка DataContractSerializer при сериализации объекта для шифрования SHA1

Одним из требований является вычисление хэша SHA1 для этих объектов класса перед отправкой их через SOAP. Для этого в настоящее время я использую расширения объектов, найденные по адресу http://alexmg.com/compute-any-hash-for-any-object-in-c/.

Однако, когда я пытаюсь выполнить сериализацию одного из классов с помощью DataContractSerializer в методе , я получаю сообщение об ошибке ниже. Тем не менее, я могу сериализовать этот же класс, используя XmlSerializer, в XML-документ без каких-либо проблем.

Тип '[namespace]. [Класс]. [Метод]' с именем контракта данных '[метод]: http://schemas.datacontract.org/2004/07/[namespace].[class]' не ожидается. Рассмотрим DataContractResolver или добавьте любые типы, не известные статически в список известных типов - например, с помощью атрибута KnownTypeAttribute или путем добавления их в список известных типов, переданных DataContractSerializer.

Любое руководство по получению этого для работы будет оценено по достоинству.

ответ

0

Я нашел this StackOverflow пост от ряда лет назад, что привело меня к old blog post и попытался реализации решения 1 из этого блога с помощью NetDataContractSerializer вместо DataContractSerializer. Теперь код работает, не бросая никаких исключений.

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; 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^