2012-03-08 4 views
3

私は[Serializable]とマークしたクラスをクリップボードにコピーしようとしています。 GetData()を呼び出すと常にnullが返されます。IDataObject.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、および値型の配列が含まれています。

答えて

3

ペンクラスはシリアル化可能とマークされておらず、MarshalByRefObjectからも継承されます。

あなたがオブジェクト

[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 
} 
0

私は、同じ問題を抱えていた私はそれが私のクラスのどの部分をテストするためにあなたの機能IsSerializableを与えるthisリンク を見つけるためにグーグルのこれらのタイプをISerializableを実装して対処する必要があります。直列化できません。この関数を使用することで、[Serializable]の部分でシリアル化可能な部分が見つかりました。直列化されるクラスが使用する(一般的なような)モジュール内で定義されたすべての構造体とクラスは、[Serializable]としてマークされなければならないことに注意してください。コードの一部はシリアル化できません。シリアル化することはできません。また、[非シリアル化]としてマークする必要があります。例:System.Data.OleDBConnection

関連する問題