バックグラウンド
VB.NET で作成したビジネス オブジェクトのコピーを作成しようとしています。ICloneable インターフェイスを実装し、Clone 関数で、BinaryFormatter を使用してオブジェクトをシリアル化し、関数から返される別のオブジェクトに逆シリアル化して、オブジェクトのコピーを作成します。
シリアル化しようとしているクラスは、クラス内に含まれる子オブジェクトと共に「シリアル化可能」としてマークされています。
次のようなコードを記述して、clone メソッドが機能することをテストしました。
Dim obj as New Sheep()
Dim dolly as Sheep = obj.Clone()
この時点ですべて正常に動作します。
問題
サード パーティ コントロールから継承するカスタム Windows フォーム コントロールがあります。このカスタム コントロールには基本的に、複製したいオブジェクトが含まれています (このオブジェクトは最終的にサード パーティ コントロールにフィードするため)。
Windowsフォームコントロール内にオブジェクトのクローンを作成して、変更をキャンセルしてオブジェクトを変更前の状態に戻すオプションを使用しながら、ユーザーがプロパティを操作できるようにしたいと考えています。ユーザーが変更を開始する前にオブジェクトのコピーを取り、それを保持して、キャンセルを押したときに準備できるようにしたいと思います。
私の考えは、次の行に沿ってコードを書くことです。
Dim copy as Sheep = MyControl.Sheep.Clone()
次に、ユーザーが のプロパティを操作できるようにしますMyControl.Sheep
。ただし、これを実行しようとすると、clone メソッドは次のような例外をスローします。
アセンブリ 'My_Assembly_Info_Here' のタイプ 'MyControl' は、シリアル化可能としてマークされていません
このエラーは、 を呼び出した時点でスローされますBinaryFormatter.Serialize(stream,Me)
。
MyControl
オブジェクトのコピーを返すメソッドを作成し、最初MyControl.Sheep
に別の変数に割り当ててから変数を複製しようとしましたが、何も機能していないようです。ただし、オブジェクトの新しいインスタンスを直接作成して複製することは問題なく機能します。
私が間違っているところはありますか?
解決
マークの答えは、これについて正しい方向に私を向けるのに役立ちました. Rocky Lhotka の このブログ投稿では、問題とその解決方法について説明しています。