IDataObject.GetData() всегда возвращает ноль с моим классом
У меня есть класс, который я пометил как [Сериализуемый], который я пытаюсь скопировать через буфер обмена. Вызов 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 ответа
Класс 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
}
У меня была та же проблема, тогда я погуглил, чтобы найти эту ссылку. Она дает вам функцию IsSerializable для проверки того, какая часть моего класса не сериализуема. Используя эту функцию, я обнаружил, что эти части и [Serializable] используют их для сериализации. Обратите внимание, что все структуры и классы, определенные внутри любого модуля (например, общего), который используется для сериализации, должны быть помечены как [Serializable]. Некоторая часть кода не может / не должна быть сериализована, и они должны быть специально помечены как [NonSerialized]. Пример: System.Data.OleDBConnection