IDataObject.GetData () всегда возвращает ноль с моим классом - PullRequest
3 голосов
/ 09 марта 2012

У меня есть класс, который я пометил как [Сериализуемый], который я пытаюсь скопировать через буфер обмена. Вызов GetData () всегда возвращает ноль.

Скопировать код:

IDataObject dataObject = new DataObject();
dataObject.SetData("MyClass", false, myObject);
Clipboard.SetDataObject(dataObject, true);

Вставить код:

if (Clipboard.ContainsData("MyClass"))
{
    IDataObject dataObject = Clipboard.GetDataObject();

    if (dataObject.GetDataPresent("MyClass"))
    {
        MyClass myObject = (MyClass)dataObject.GetData("MyClass");
        // myObject is null
    }
}

MyClass на самом деле является производным классом. И он, и его база помечены как [Сериализуемые]. Я попробовал тот же код с простым тестовым классом, и он работал.

MyClass содержит GraphicsPath, Pen, Brush и массивы типов значений.

Ответы [ 2 ]

3 голосов
/ 09 марта 2012

Класс Pen не помечен как сериализуемый, а также наследуется от MarshalByRefObject.

Вам потребуется реализовать ISerializable и обрабатывать объекты этих типов

[Serializable]
public class MyClass : ISerializable
{
    public Pen Pen;

    public MyClass()
    {
        this.Pen = new Pen(Brushes.Azure);
    }

    #region ISerializable Implemention

    private const string ColorField = "ColorField";

    private MyClass(SerializationInfo info, StreamingContext context)
    {
        if (info == null)
            throw new ArgumentNullException("info");

        SerializationInfoEnumerator enumerator = info.GetEnumerator();
        bool foundColor = false;
        Color serializedColor = default(Color);

        while (enumerator.MoveNext())
        {
            switch (enumerator.Name)
            {
                case ColorField:
                    foundColor = true;
                    serializedColor = (Color) enumerator.Value;
                    break;

                default:
                    // Ignore anything else... forwards compatibility
                    break;
            }
        }

        if (!foundColor)
            throw new SerializationException("Missing Color serializable member");

        this.Pen = new Pen(serializedColor);
    }

    void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
    {
        info.AddValue(ColorField, this.Pen.Color);
    }
    #endregion
}
1 голос
/ 17 марта 2013

У меня была такая же проблема, как я гуглил, чтобы найти эту ссылку. Она дает вам функцию IsSerializable для проверки, какая часть моего класса не сериализуема.Используя эту функцию, я обнаружил, что эти части и [Serializable] используют их для сериализации.Обратите внимание, что все структуры и классы, определенные внутри любого модуля (например, общего), который используется для сериализации, должны быть помечены как [Serializable].Некоторая часть кода не может / не должна быть сериализована, и они должны быть специально помечены как [NonSerialized].Пример: System.Data.OleDBConnection

...