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