• 締切済み

CArrayのシリアライズの方法を教えてください。

VC++ 2003, MFC SDIです。 Windowsでプログラムを始めて数週間のものです。 CMyDataという自分で作ったクラスのインスタンスを要素にもつCArrayを作りました。 CArray <CMyData, CMyData> myArray; と宣言して一応要素の追加削除、データの取り出しはスムーズにできるのですが、保存、読み込みの方法がわかりません。 CMyDataのメンバ変数の中身はすべてCStringなので、ドキュメントクラスのSrialize関数内で、ループで、ar.WriteString(myArray[i].getName())見たいに要素をひとつずつテキストに書き込んだり、読み込んだりはできるのですが、できればmyArrayをバイナリで一発保存、読み込みができれば楽かなと思います。 どのドキュメントを読んでもCArrayはSerializeをサポートしているって書かれているんですが、具体的なやり方が見つかりません。 ちなみにCMyDataはCObjectを継承できませんでした。継承すると、myArrayに追加できません。ここもちょっとわからないんですが。。。 どなたかご教授お願いします。

みんなの回答

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

マイクロソフトのドキュメント 「シリアル化 : シリアル化可能なクラスの作成」 「シリアル化 : オブジェクトのシリアル化」 を読んでみて下さい。

関連するQ&A

  • vector<int> に Serialize を使いたい!!

    VC++ の MFI で SDI をやっています。 Doc クラスにある整数のメンバ変数   CArray<int, int> nums を Serialize を使って読込・保存するには void Cなんかの名前Doc::Serialize(CArchive& ar) { if (ar.IsStoring()) { // TODO: 格納するコードをここに追加してください。 nums.Serialize(ar); } else { // TODO: 読み込むコードをここに追加してください。 nums.Serialize(ar); } } とすることができます。 ここで質問です。 もし Doc クラスにある整数のメンバ変数   vector<int> nums についても Serialize を使って同様に読込・保存するには どのように記述したら良いのでしょうか。

  • コンストラクタについて

    VCの勉強をしています。 ちょっとショッキングなことを聞いてしまいました。 クラスのインスタンスを作成した場合、 コンストラクタは継承もとのコンストラクタもよばれる?? これって本当ですか!! MFCだとクラスの階層はだいぶ深いです。 例えば基本のCviewなんかはCObject>CCmdTarget>CWnd>Cviewの順に継承されています。 MFCでは更にCViewを継承したCTestViewなんてクラスがコードの主役です。 それでCTestViewのインスタンスを作成した場合、 コンストラクタはCTestViewのコンストラクタだけ実行すると思いますが、 ショッキングな内容ではCViewのコンストラクタも実行されてます。 これって本当にそうなるのでしょうか。 もし、そうならコンストラクタはてっぺんのCObjectから順に実行されますか。 それとも1つ上の継承先だけですか。 また、何でこんな仕組みにする必要があるのですか? 更にいえばCObjectにはSerializeという関数があります。 これをCTestView.serializeとした場合、 CObjectから順々にSerializeが呼び出されているのでしょうか? そんなことあるわけないよと、あまりにもバカバカしいのですが、 知人がそうだと言い張るのでよろしくお願いします。

  • Serialize で困ってます!!

    はじめまして。 "Hello world!" を勉強してから半年ほどの C++ 初心者です。 Visual Studio.NET 2003 で MFC でアプリを開発しています。 自作したクラス(これは CObject クラスを継承してます)に Serialize をオーバーライドして,クラスのファイル読み書きを 簡単に行えるようにしています。 MFC は素晴らしいと,初心者ながらに感動しております。 いま Serialize に関する問題に直面しています。 クラスにメンバ(のデータ)を増やしたときのことです。 クラスの Serialize を記述しなおして,正しく動作するようにはなりました。 ところが,(当然ですが)記述しなおす前の Serialize で保存したファイルを読むと 「予期しないファイル形式です」となります。 このような場合に,一般的なエラー回避方法はあるのでしょうか? クラスにメンバをたった 1 つつけ加えただけで,エラーが出て不便に思います。 クラスにメンバをつけくわえることは,アプリのバージョンアップ等でも必要だと思うのですが。。。 初心者につき,間抜けな質問をしているかもしれませんが,ご教授いただければ幸いです。

  • ダイアログベースでのデータの保存について

    環境 WIN98 VC++6.0 MFC にて SDIベースで基本クラスをCFormViewとした場合、フォーム上のエディットボックスに入力したデータを保存する方法として以下のサンプルコードがありました。 void CVcdtstDoc::Serialize(CArchive& ar) { int i; //■追加 CString endmark="___end___"; //■追加 if (ar.IsStoring()) { // TODO: この位置に保存用のコードを追加してください。 //------------------------------■ここから追加 for(i=1; i<=maxct; i++){ ar << mydata[i]; } ar << endmark; //------------------------------■ここまで追加 } else { // TODO: この位置に読み込み用のコードを追加してください。 //------------------------------■ここから追加 for(i=1; i<=100; i++){ ar >>mydata[i]; if(mydata[i]==endmark){ --i; break; } } maxct=i; if(maxct>0) pos=1; //------------------------------■ここまで追加 } } 同様にシリアル化をダイアログベースのプログラムでやりたいのですが、どのようにすれば良いのでしょうか? ヒント程度では分からないと思いますので、具体的お願いしたいのですが、また参考サイトなどもあればお願いいたします。

  • VectorにClone()メソッドを追加する方法

    Vectorクラスを継承または何かのインタフェースを実装して、Clone()メソッドを追加したMyVecotorを作成したのですがどうしたらいいですか? MyVector mv = new MyVector(); MyVecotr mv2; mv2 = mv.Clone(); //すべての要素をCloneする mv2 = mv.Clone(4,10); //要素4~10までの要素をCloneする 動きとしてはこんな感じです。

  • CList, CArchive, CFileの組み合わせ

    Bookクラスという自分で定義したクラスのリストをテキストファイルに保存することは成功したのですが、テキストファイルから、データーを取り出そうとすると下記のようなエラーが出ます。 "An attempt was made to access an unnamed file past its end" プログラムの構造はこんな感じです。 class book : public CObject { DECLARE_SERIAL(book) private: ......... public ......... void Serialize (CArchive ar); }; void CAssignment2Dlg::OnButtonSave() { CList bookList; CFile fileBook("book.txt", CFile::modeRead); CArchive archvBook(&fileBook, CArchive::load); bookList.Serialize(archvBook); ... となっているのですが、どうしたらよいのでしょうか?よろしくお願いします。

  • [VB.NET]クラスのシリアライズでエラーが発生

    プログラムを作っていて設定を保存するためのクラスを作ったのですが原因不明のエラーが出てきてしまいます。 Public Class cde_config Const CONFIG_FILE As String = "config.xml" Public FolderName As String Public exex As New ArrayList Public Sub New() If File.Exists(CONFIG_FILE) Then Dim serializer As XmlSerializer = New XmlSerializer(GetType(cde_config)) Dim stream As FileStream = New FileStream(CONFIG_FILE, FileMode.Open) Try Me.FolderName = CType(serializer.Deserialize(stream), cde_config).FolderName 'ここでエラーが発生 Me.exex = CType(serializer.Deserialize(stream), cde_config).exex Finally stream.Close() End Try Else FolderName = "略" exex.Add(New String("略")) End If End Sub Public Sub save() Dim serializer As XmlSerializer = New XmlSerializer(GetType(cde_config)) Dim stream As FileStream = New FileStream(CONFIG_FILE, FileMode.Create) Try serializer.Serialize(stream, Me) Finally stream.Close() End Try End Sub End Class エラーの内容は 'System.InvalidOperationException' のハンドルされていない例外が system.xml.dll で発生しました。 追加情報 : XML ドキュメント (2,2) でエラーが発生しました。 です。 どこに問題があるのでしょうか。

  • 継承元のpublicなメンバ関数を隠ぺいしたい

    C++です.(VC++2013) 親クラスではpublicで宣言されているメンバ関数があり,継承後はこのメンバ関数を隠ぺいしたいときはどのようにすればよいのでしょうか. 具体的には,std::vectorから派生したクラスを定義し,この独自クラスのインスタンスへ要素を追加する場合は,新しく独自に定義した関数を通じて行います. そのため,push_back()を呼べないようにしたいのです. 自分で作成した関数には,pushという名前をつけたいので,単純に自分の要素追加の関数をpush_backという名前でオーバーライドすることはできません. push関数内では,push_backした後,即座にsortしたいので,push_backをいう名前をつけたくないのです. とりあえずは,派生クラスでprivateにpush_backをオーバーライドし,自分で作った要素追加の関数で使うpush_backはstd::vectorのものを用いることを明示することでできました. 他にも何かやり方があれば,ご教授下さい.

  • 親フレームのjQueryオブジェクトを使えるか?

    html(親html)上に別のhtml(子html)を<iframe>で表示しています。 親htmlではjQuery(v1.8.2)を使用しています。 子htmlでもjQueryを使いたいです。 単純に子htmlでjquery.jsを読み込めば良いですが、勉強のため以下のように親htmlのjQueryオブジェクトを使って実現してみました。 【子htmlのscript】 var $ = parent.jQuery; $(window).load(function() {   $("body", document).append( "hoge" ); }); これで見た目は正しく動作してますが、以下の不明点が出てきたので質問させて下さい。 【質問】 $(window).loadではなく$(document).readyを使った場合は"hoge"が追加されていませんでした。 <body>要素がまだ読み込めていないせいかとも思いましたが、documentの読み込み完了後に実行されているはずです。 なぜ"hoge"が追加されないのでしょう? このdocumentは親htmlのdocumentなのでしょうか? ただ、$("body").append( "hoge" )と書いた場合は親htmlに"hoge"が追加され、$("body", document).append( "hoge" )と書くことで子htmlに"hoge"が追加されるようなので、親htmlのdocumentではない気がします。 よろしくお願いします。

  • 変更したstyleの値を変更前に戻すには?

    例えば、スタイルシートで、サイズを指定しなかったDIV要素の 高さを変更したとします。それを元に戻したいと考えています その場合、デフォルトの高さを得る方法とかあるのでしょうか? もし、前もって保存しておく!というのならば、勝手に document.getElementById('xxx').originallyHeight = 高さ 見たいにして勝手に(originallyHeightなどを)追加しても、良いのでしょうか?

専門家に質問してみよう