- PR -

シリアル化 逆シリアル化

1
投稿者投稿内容
TID
会議室デビュー日: 2004/07/16
投稿数: 5
投稿日時: 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"を引数にとる暗黙のコンストラクタは、
ヘルプ:シリアル化のカスタマイズ によれば、
「基本クラスのそのコンストラクタを実行した上でカスタマイズする」とありますが、
基本クラスにはそのシグネチャを持つコンストラクタがありません。


どのようなアプローチで解決したらよいのでしょうか
よろしくお願いします


コード:

<Serializable()> _
Public Class myTreeNode
    Inherits TreeNode

    Public SampleClass1 As New SampleClass(100)

    '逆シリアル化に必要な既定のコンストラクタ
    Public Sub New()
        MyBase.New()
    End Sub

    '逆シリアル化に必要な暗黙のコンストラクタ
    '下の引数を受けるコンストラクタが基本クラスにない
    Private Sub New(ByVal info As SerializationInfo, ByVal context As StreamingContext)
        MyBase.New(info, context)
    End Sub

    'GetObjectData()メソッドの実装
    '↓「インターフェイス'ISerializable'は、
    '   このクラスによって実装されていません」というビルドエラー
    Public Sub GetObjectData(ByVal info As System.Runtime.Serialization.SerializationInfo, _
                             ByVal context As System.Runtime.Serialization.StreamingContext) _
                             Implements ISerializable.GetObjectData
    End Sub

End Class


<Serializable()> _
Public Class SampleClass
    Implements ISerializable

    Public myNumber As Integer = 0

    '逆シリアル化に必要な既定のコンストラクタ
    Public Sub New()
    End Sub

    Public Sub New(ByVal myNumber As Integer)
        Me.myNumber = myNumber
    End Sub

    '逆シリアル化に必要な暗黙のコンストラクタ
    Private Sub New(ByVal info As SerializationInfo, ByVal context As StreamingContext)
        MyClass.myNumber = info.GetInt32("number")
    End Sub

    'GetObjectData()メソッドの実装
    Public Sub GetObjectData(ByVal info As System.Runtime.Serialization.SerializationInfo, _
                             ByVal context As System.Runtime.Serialization.StreamingContext) _
                             Implements ISerializable.GetObjectData
        info.AddValue("number", MyClass.myNumber)
    End Sub
End Class



burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 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)

ではないでしょうか?
TID
会議室デビュー日: 2004/07/16
投稿数: 5
投稿日時: 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)コンストラクタ

がないのはどういうことなのでしょうか?
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2004-09-17 15:53
MSDNにはTreeNodeがISerializableを実装していると書いてありますが
オブジェクトブラウザで見るとたしかに
MarshalByRefObjectがISerializableを実装していますね。
しかも両方ともGetObjectDataがみあたりません。。。

なぜでしょう???
TID
会議室デビュー日: 2004/07/16
投稿数: 5
投稿日時: 2004-09-17 17:02
オブジェクトをXMLでシリアライズ(6) によれば 'GetObjectData'をオーバーライドする場合
MyBase.GetObjectDataで基本クラスの'GetObjectData'を処理した上で
自分のメンバをシリアライズするコードを付加するという事ですが
基本クラス(TreeNode)に'GetObjectData'がないので今回は空にしてます
それが原因でシリアライズしたものが空なのでしょうか?
1

スキルアップ/キャリアアップ(JOB@IT)