- - PR -
シリアル化 逆シリアル化
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2004-09-16 20:58
早速ですが分かる方がいれば教えてください
環境:VB.NET 2003 フィールド(SampleClass1)を1つ追加した、 TreeNodeクラスの派生クラス(myTreeNode)を作成しました。 追加したフィールドは自作クラス型(SampleClass型)です。 「.NETでいきまっしょい!」 を参考にして、 myTreeNodeクラス(いくつかmyTreeNode.Nodes.Add(ノード)してあります)の 逆シリアル/シリアル化をしました。 しかし、逆シリアル化されたものは、 myTreeNodeのNodeCountが0で、AddしたMyTreeNodeはありません それと、SampleClass1 もNothingです 正常にできていない原因は、 MyTreeNodeクラスの"GetObjectData"メソッドと、 "info,context"を引数にとる暗黙のコンストラクタだと思っています まず、GetObjectDataの方は "ISerializable.GetObjectData"を実装しようとすると、 TreeNode(基本クラス)クラスに "ISerializable"の実装があるにもかかわらず 「インターフェイスはこのクラスに実装されていません」というビルドエラーとなります。 また、"info,context"を引数にとる暗黙のコンストラクタは、 ヘルプ:シリアル化のカスタマイズ によれば、 「基本クラスのそのコンストラクタを実行した上でカスタマイズする」とありますが、 基本クラスにはそのシグネチャを持つコンストラクタがありません。 どのようなアプローチで解決したらよいのでしょうか よろしくお願いします
| ||||
|
投稿日時: 2004-09-17 10:34
myTreeNodeはTreeNodeの派生なんで
Public Overrides Sub GetObjectData(ByVal info As System.Runtime.Serialization.SerializationInfo, _ ByVal context As System.Runtime.Serialization.StreamingContext) ではないでしょうか? | ||||
|
投稿日時: 2004-09-17 12:14
burton999さんの仰る通り、オーバーライドで処理しましたが、
「sub 'GetObjectData'はベースクラスの sub をオーバーライドしない為、 'Overrides'として宣言する事はできません」というビルドエラーとなります。 オブジェクトブラウザで確認しましたが、TreeNodeクラスには'GetObjectData' メソッドがありませんでした。 'TreNode'クラスは'MarshalByRefObject'の派生クラスですが、 'MarshalByRefObject'の方で'ISerializable'インターフェイスが実装されています。 このことは何か関係しているのでしょうか? 'ISerializable'インターフェイスを実装している'TreNode'クラスに 1. 'GetObjectData'メソッド と 2. Private Sub New(ByVal info As SerializationInfo, _ ByVal context As StreamingContext)コンストラクタ がないのはどういうことなのでしょうか? | ||||
|
投稿日時: 2004-09-17 15:53
MSDNにはTreeNodeがISerializableを実装していると書いてありますが
オブジェクトブラウザで見るとたしかに MarshalByRefObjectがISerializableを実装していますね。 しかも両方ともGetObjectDataがみあたりません。。。 なぜでしょう??? | ||||
|
投稿日時: 2004-09-17 17:02
オブジェクトをXMLでシリアライズ(6) によれば 'GetObjectData'をオーバーライドする場合
MyBase.GetObjectDataで基本クラスの'GetObjectData'を処理した上で 自分のメンバをシリアライズするコードを付加するという事ですが 基本クラス(TreeNode)に'GetObjectData'がないので今回は空にしてます それが原因でシリアライズしたものが空なのでしょうか? |
1