C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: ISerializableインターフェースの実装に関して


(過去ログ 27 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■12550 / inTopicNo.1)  ISerializableインターフェースの実装に関して
  
□投稿者/ しろやぎ (1回)-(2008/01/11(Fri) 15:31:42)

分類:[.NET 全般] 

C# 2005でやっています。
シリアライズに関する質問をさせていただきます。よろしくお願いします。

基本クラスがISerializableを実装していない場合、派生クラスにはISerializableは実装できないんですか?
具体的には、

// Hogeクラスに特化したリスト
class HogeList : List<HogeList>, ISerializable
{
 // なんかのメンバ
 string _name;

 // デシリアライズの際に使われるコンストラクタ
 public HogeList(SerializationInfo info, StreamingContext context)
 {
  // todo : リストの中身を復元

  // _nameを復元
  n1 = info.GetString("_name");
 }

 // シリアライズのときに使われるメソッド
 public void GetObjectData(SerializationInfo info, StreamingContext context)
 {
  // todo : リストの中身をシリアル化

  // _nameをシリアル化
  info.AddValue("_name", _name);
 }
}

みたいに、ISerializableを実装しないList<T>を継承したクラスをシリアライズしたいと思っています。
しかし、todoのところで基本クラスの情報をシリアル化/デシリアル化する正当な方法がわかりません。
MSDNにも

*----- 引用はじめ -----*
クラス継承の場合、基本クラスが ISerializable を実装していれば、その派生クラスをシリアル化できます。
この場合、派生クラスは、その GetObjectData 実装の中で、基本クラスに実装されている GetObjectData を呼び出す必要があります。
それ以外の場合、基本クラスからのデータはシリアル化されません。
*----- 引用おわり -----*

って書いてあるし...、無理かなぁ。


継承を使うのがダメで、以下のようにコンポジションを使うべきですかね?
class HogeList : IList<Hoge>, ISerializable
{
 List<Hoge> _innerList;
 string _name;

 // 実装の詳細...
}


どなたか気が向いたらコメントをお願いします。
引用返信 編集キー/
■12555 / inTopicNo.2)  Re[1]: ISerializableインターフェースの実装に関して
□投稿者/ なちゃ (95回)-(2008/01/11(Fri) 15:59:39)
なんでISerializableを実装したいんでしょうか?
Serializable属性を適用するだけじゃ駄目?

引用返信 編集キー/
■12558 / inTopicNo.3)  Re[2]: ISerializableインターフェースの実装に関して
□投稿者/ しろやぎ (2回)-(2008/01/11(Fri) 16:22:42)
> なんでISerializableを実装したいんでしょうか?
> Serializable属性を適用するだけじゃ駄目?

一言でいうと、難読化絡みで、シリアライズの処理をカスタマイズしたいんです。

・あるクラスのメンバ変数が増えた時など(つまりソースを書き換えた時)、難読化後のメンバ変数名が一意に保たれないのでデシリアライズできなくなってしまう。
・シリアライズ対象でない、ワーク変数なんかもそこで初期化しようと考えている。

とかです。
引用返信 編集キー/
■12561 / inTopicNo.4)  Re[3]: ISerializableインターフェースの実装に関して
□投稿者/ 囚人 (276回)-(2008/01/11(Fri) 16:39:28)
できますよ。

ISerializable は「お好きなようにカスタマイズどうぞ」ですので、極端な話、基底クラスのシリアル化を行う必要すらありません。

List<T> の場合なんかは、T がシリアル化できるかどうかも絡んでくるので、結構面倒そうですね。

T がシリアル化不能の場合と可能の場合の違いの仕様はどうなんでしょ?

引用返信 編集キー/
■12562 / inTopicNo.5)  Re[3]: ISerializableインターフェースの実装に関して
□投稿者/ なちゃ (96回)-(2008/01/11(Fri) 16:43:53)
うーん…どうやるんだろう…
試してはいませんがAddValueにthisじゃやばそうですよねあからさまに…
Typeに基底型わたしても違いそうな気がしますし…

引用返信 編集キー/
■12564 / inTopicNo.6)  Re[4]: ISerializableインターフェースの実装に関して
□投稿者/ なちゃ (97回)-(2008/01/11(Fri) 16:46:21)
ああ、まあ全部自分で書けば出来ますね。
多分既定の動作を利用する方法がないか、ということだと想定して書きました。
引用返信 編集キー/
■12570 / inTopicNo.7)  Re[5]: ISerializableインターフェースの実装に関して
□投稿者/ しろやぎ (4回)-(2008/01/11(Fri) 17:40:43)
> List<T> の場合なんかは、T がシリアル化できるかどうかも絡んでくるので、結構面倒そうですね。
> T がシリアル化不能の場合と可能の場合の違いの仕様はどうなんでしょ?
そこは大丈夫です。
Tはシリアル化可能という前提がありますんで。

> ああ、まあ全部自分で書けば出来ますね。
おっしゃるとおりですね。

// デシリアライズの際に使われるコンストラクタ
public HogeList(SerializationInfo info, StreamingContext context)
{
 // リストの中身を復元
 List<Hoge> super = info.GetValue("super", typeof(List<Hoge>)) as List<Hoge>;
 AddRange(super);

 // _nameを復元
 _name = info.GetString("_name"); // ←さっき、n1って書いてました。_nameの間違いです。
}

// シリアライズのときに使われるメソッド
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
 // リストの中身をシリアル化
 List<Hoge> super = new List<Hoge>(this);
 info.AddValue("super", super);

 // _nameをシリアル化
 info.AddValue("_name", _name);
}
のようにやろうと考えてました。

> 多分既定の動作を利用する方法がないか、ということだと想定して書きました。
ということで、既定の動作を利用する方法はないということで理解しておきます。


コメントを下さったなちゃさま、囚人様、ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -