3

我有一个我标记为 [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 和值类型数组。

4

2 回答 2

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
}
于 2012-03-08T21:09:55.483 回答
1

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

于 2013-03-16T22:48:05.413 回答