Похоже, что десериализация не работает со строго именованными объектами в IDE - PullRequest
2 голосов
/ 09 июня 2009

Положение:

У меня есть куча бизнес-объектов, сидящих за веб-сервисом. Все объекты инкапсулированы в BusObjects.DLL, который строго назван и находится в GAC на сервере (потому что другие приложения на сервере также обращаются к нему).

У меня есть клиентское приложение с однократным нажатием, которое вызывает указанный веб-сервис. Приложение с одним кликом также поставляется с этим BusObjects.DLL.

Веб-служба возвращает данные клиенту следующим образом: она сериализует бизнес-объект до байтового массива и возвращает этот байтовый массив клиенту. Клиент десериализует полученный байтовый массив обратно в бизнес-объект. Это возможно потому, что код клиента и сервера имеют ссылку на один и тот же BusObjects.DLL. Это все прекрасно работает.

Проблема для меня заключается в следующем. Когда у меня есть клиентское решение (которое включает проект BusObjects) в IDE VS2005, код не может десериализовать массив байтов обратно в бизнес-объект, потому что, как утверждается,

"Не удалось загрузить файл или сборку «CC.BusObjects, Версия = 2.12.1.47, Культура = нейтральная, PublicKeyToken = af56fdb58c626305 'или одна из его зависимостей. Расположенный определение манифеста сборки делает не совпадает со ссылкой на сборку. (Исключение из HRESULT: 0x80131040) "

Я попробовал соответствующие версии, но, похоже, ничего не работает, если на проект BusObjects ссылаются как на проект, а не на внешнюю сборку. К сожалению, я должен иметь BusObjects внутри решения для отладки.

Что я могу сделать, чтобы исправить эту проблему? Я слышал о перенаправлении версий, но не могу заставить его работать со строго названной сборкой, но, возможно, я делаю это неправильно.

Вот код сериализации и десериализации:

    public static byte[] ToBinary(Object objToBinary)
    {
        MemoryStream memStream = new MemoryStream();
        BinaryFormatter formatter = new BinaryFormatter(null, 
                  new StreamingContext(StreamingContextStates.Clone));
        formatter.Serialize(memStream, objToBinary);
        memStream.Seek(0, SeekOrigin.Begin);
        return memStream.ToArray();
    }


    public static object BinaryTo(byte[] objFromBinary)
    {
        MemoryStream ms = new MemoryStream(objFromBinary);
        BinaryFormatter formatter = new BinaryFormatter();
        ms.Position = 0;
        object obj = formatter.Deserialize(ms);
        return obj;
    }

Для сериализации:

[WebMethod]
public byte [] GetContacts()
{
   return ToBinary(BusObjects.GetContacts());
}

Для десериализации:

byte [] bts = ContactService.GetContacts();
List<Contact> lstContacts = (List<Contact>) BinaryTo(bts);

1 Ответ

2 голосов
/ 09 июня 2009

Что почти наверняка происходит, так это то, что у вас установлен номер версии, который автоматически увеличивается в процессе сборки. Это часто приводит к разным сценариям с номерами версий, которые могут вызвать проблемы с загрузкой, которые вы наблюдаете.

Попробуйте следующее

  • Перейти к обозревателю решений.
  • Разверните узел свойств
  • Открыть AssemblyInfo.cs
  • Измените атрибут AssemblyVersion, чтобы иметь жестко закодированный номер версии
...