- - PR -
private なListオブジェクトの中のオブジェクトもシリアライズしたい
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2007-06-22 09:38
こんにちは。お世話になってます。
たとえば、以下のようなソースコードがあります。 Formのコマンドボタンを押すと、ClassDオブジェクトを生成してシリアライズしてxmlファイルを出力します。 ClassDにClassEを保持するList型の変数がありますが、List型の変数そのものはprivateにしており、property経由のみでアクセスするようにしています。 この際、ClassEに保持しているClassAを保持するList型の中のオブジェクトもシリアライズ/デシリアライズしたいのですが、xmlに出力されません。 これらもxmlに出力したいのですが、どうすればいいのでしょうか? やはり、xmlに吐き出したい変数はprivateとpropertyにせず、publicにすべきですか? 以下のソースは説明しやすいように、VB.NET 2005 で書いていますが、実際の開発はVC++.NET 2005 C++/CLI でやってます。
[ メッセージ編集済み 編集者: maru 編集日時 2007-06-22 09:40 ] | ||||
|
投稿日時: 2007-06-22 09:48
自己レスです。
http://msdn2.microsoft.com/ja-jp/library/bdxxw552(VS.80).aspx に「オブジェクトのパブリックとプライベート両方のフィールドとプロパティをすべてシリアル化するには、BinaryFormatter を使用します。」とありました。 BinaryFormatter を調べてみます。 お騒がせしました。 | ||||
|
投稿日時: 2007-06-22 11:07
あれから BinaryFormatter でシリアライズを試みています。
VB.NETで小さなサンプルプログラムをつくって検証してみて要領がわかったので、 本アプリ(VC++.NET 2005 C++/CLI)に組み込もうとしています。 関連しそうなクラスに Serializable属性 や NonSerialized属性 をつけたりして BinaryFormatter でシリアライズしてみているのですが、「○○はシリアル化可能として設定されていません。」という旨のメッセージが出ます。 大まかなクラス図を描いて、関連するクラスを見つけては属性をつけて、実行してみての繰り返しで、少しづつつぶしているのですが、クラス構造が巨大で複雑なため結構地味な作業です。 何か簡単にできる方法はないでしょうか? [ メッセージ編集済み 編集者: maru 編集日時 2007-06-22 11:15 ] | ||||
|
投稿日時: 2007-06-22 15:42
>やはり、xmlに吐き出したい変数はprivateとpropertyにせず、publicにすべきですか? いいえ。 たとえデータを保持するだけのクラスであっても、 検証動作などを入れる可能性はあります。 propertyはpropertyのままでシリアライズするべきです。 ぱっと見たところ、
ここは問題があります。 ReadOnlyだとプロパティaを設定できません。 コレクション以外はReadOnlyにできなかったと記憶しています。 シリアライザの中で、ClassEを作成してからClassDに設定するのを理解すれば、 ClassEに引数なしコンストラクタが必要、 ClassDの該当プロパティはReadOnlyではだめ、 というのが理解できるかと思います。 >何か簡単にできる方法はないでしょうか? なにが大変なのか、よくわかりませんが、 クラス作成時からシリアル化を考慮し、 SerializableであろうクラスにはかならずSerializableをつけるのが 普通ですので、あまり困ったことがありません。 >何か簡単にできる方法はないでしょうか? >クラス構造が巨大で複雑なため結構地味な作業です。 地味にやればできるとわかっているなら、それが一番簡単です。 また、プログラムは、一般的に地味な作業です。 派手にプログラムを組む人を見たことがありません。 | ||||
|
投稿日時: 2007-06-22 18:54
もう一回、XMLシリアライズ関係のリファレンスを読み直そう。
private なフィールドでも、public で読み書き可能なプロパティがあれば、XMLシリアライズできます。 GDNJにあるんだよな... _________________ |
1