IDataObject.GetData()总是在我的类中返回null

时间:2012-03-08 20:25:33

标签: c# clipboard serializable idataobject

我有一个我标记为[Serializable]的类,我正试图通过剪贴板复制。调用GetData()始终返回null。

复制代码:

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实际上是一个派生类。它和它的基数都被标记为[Serializable]。我用一个简单的测试类尝试了相同的代码并且它有效。

MyClass包含GraphicsPath,Pen,Brush和值类型数组。

2 个答案:

答案 0 :(得分:3)

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 :(得分:1)

我遇到了同样的问题,然后我用谷歌搜索this链接 它为您提供了一个函数IsSerializable来测试我的类的哪个部分不可序列化。通过使用此函数,我发现使用[Serializable]的那些部分使它们可序列化。请注意,要序列化的类使用的任何模块(如常规)中定义的所有结构和类必须标记为[Serializable]。代码的某些部分不能/不应该被序列化,它们应该被特别标记为[NonSerialized]。例如:System.Data.OleDBConnection