Простой сериализуемый класс, который мы используем для хранения файлов в буфере обмена, не десериализуется должным образом из одной версии нашего приложения в другую.
В нашем приложении C ++ / CLI .NET WindForms мы используем следующий класс для загрузки файлов (часто нескольких файлов) в буфер обмена.
[Serializable]
public ref class ByteWrapper
{
public:
ByteWrapper() {
m_Bytes = nullptr;
}
virtual ~ByteWrapper() {
delete m_Bytes ;
}
array<Byte>^ GetArray() { return m_Bytes; }
size_t GetSize() { return m_Bytes->Length; }
void SetSize(const int nSize) {
delete m_Bytes;
m_Bytes = gcnew array<Byte>(nSize);
}
protected:
array<Byte>^ m_Bytes;
};
Мы используем System :: Windows :: Forms :: DataObject и его функцию SetData (которая принимает ключ, а System :: Object (экземпляр этого класса ByteWrapper) - где ключ является внутренним уникальным именем.
Проблема, с которой мы сталкиваемся, заключается в том, что когда мы копируем из старой версии нашего приложения (созданной с VS2013 и .NET 4.5) и пытаемся вставить новую версию нашего приложения (созданной с VS2017 и .NET 4.6.2) ), вызов System :: Windows :: Forms :: Clipboard :: GetData (с действительным ключом - ContainsData возвращает true), мы получаем обратно System :: IO :: MemoryStream и НЕ ByteWrapper.
Это все работает хорошо, если мы копируем и вставляем в нашу новую версию.
Есть мысли? Мы хотели бы иметь возможность это исправить - или хотя бы понять, что происходит, чтобы избежать этого в будущих версиях.
Обратите внимание, что класс ByteWrapper НЕ изменился вообще между этими версиями.