Сериализуемый класс не сохранится в буфере обмена в разных версиях .NET или Visual Studio. - PullRequest
0 голосов
/ 30 апреля 2019

Простой сериализуемый класс, который мы используем для хранения файлов в буфере обмена, не десериализуется должным образом из одной версии нашего приложения в другую.

В нашем приложении 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 НЕ изменился вообще между этими версиями.

...