|
分類:[C#]
こんばんわ。 C# / VS2010 / Windows7にて開発を行っております。
相変わらずプロパティグリッドにデータをずらっと表示して、それをセーブ…なんてことをしているのですが、 このデータをコピーする必要があるのをすっかり忘れたまま作業してました。
//これはディープコピー必須なので、後で書き換える とかコメントで書いたまま3カ月以上が過ぎ…(バカ
データ自体は普段、XMLSerializerを使用してセーブ/ロードしているのですが、 データ自体がかなり大きいですし、内部に別のクラスオブジェクトをいくつも保持しているため、 どうしようかと頭を抱えてしまった状況です。
少し調べてみましたところ、 コピーコンストラクタを作成する方法(でも、全てのクラスに作らないとクラス内のクラスオブジェクトはシャローコピーになるのでひどく手間) Object.MemberwiseCloneでシャローコピーをする方法(そもそもシャローコピー) ICloneableを継承してCloneメソッド内に自分で定義する方法(でもこれってコピーコンストラクタと変わらないですよね) シリアライズしてデシリアライズする方法がありました。
ここで、普段使用しているXMLSerializerを使って シリアライズしてデシリアライズすれば良いのではないか?という結論に達しているのですが、 この場合どこかにXMLを一旦保存する必要があると思いますので、 それはそれでもっと良い方法がないかな?と思った次第です。
で、これとは別にunsafeコード内でデータ自体を取得するメソッドを自分で作っているのですが、 これはC++から呼び出しを行わせております。 こちらでできないかな?と試したのですが、C#から呼び出したらバッファオーバーランして逝ってしまわれました…。
//大雑把にはこんな感じ void* pCopy = new byte[DataSize]; //確保しているDataSize分だけ現在のデータを取得 pComInterface->GetData(pCopy,DataSize);
//pCopyの中身を書き換え
//データセット pComInterface->SetData(pCopy,DataSize);
さて、このGetDataメソッドをC#自身で呼ぼうとした場合に、 byte[] byteCopy = new byte[DataSize];
fixed(byte* pByte = &byteCopy[0]) { GetData(pByte,DataSize); //オーバーランでさようなら }
としてみたのですが、コメントの通りになってしまいました。 ちなみに、DataSizeはC++側とC#側と全く同じ数値です。 byteCopyで取得する配列というのが、メモリ上で並んでいるのか?というのが1つ疑問なのですが… どうして逝かれてしまったし(お前のせいだ!)
というわけです。 いずれかの方法で良いのですが、うまくいかないものかと…。 もしくは別の楽な方法があれば教えて頂けませんでしょうか?
宜しくお願い致します。
|