- PR -

コレクションのシリアライズ

1
投稿者投稿内容
SOA
会議室デビュー日: 2005/11/13
投稿数: 3
投稿日時: 2005-12-08 09:31
ユーザーコントロールを作成し、デザインモード時に、
Itemを追加できるようにしました。
そのItemはコレクション型にしています。
(リストボックスのItemプロパティのような感じです。)

シリアライズしても、コレクションがあるとダメなのか、
NewやAddのメソッドをMSのヘルプに従って、
コレクションに入れてあるのにシリアル化してくれません。

どなたか、ご存知の方がいらっしゃったら、
是非ご教授ください。

コレクションはCollectionBaseを継承しています。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-12-08 10:04
こんにちは。

そのコレクションには、SerializableAttribute をつけていますか?
そして、コレクションの項目はシリアライズ可能ですか?

_________________
囚人のジレンマな日々
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2005-12-08 19:59
SOAさん、こんばんは。

引用:

ユーザーコントロールを作成し、デザインモード時に、
Itemを追加できるようにしました。



引用:

コレクションに入れてあるのにシリアル化してくれません。


これはもしかして、コレクション型のプロパティにフォームデザイナで Item を追加しているのにコード上にシリアル化されないという話でしょうか?

もしもそうであれば、Item 用の型コンバータを用意する、という方法が考えられます。
以下サンプル。

コード:

'コントロール
Imports System.ComponentModel
Imports System.ComponentModel.Design.Serialization

Public Class MyUserControl
    Inherits System.Windows.Forms.UserControl

    Private _Items As MyItemCollection = New MyItemCollection

    <DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
    Public ReadOnly Property Items() As MyItemCollection
        Get
            Return _Items
        End Get
    End Property

    'その他諸々省略

End Class

'コレクション
Public Class MyItemCollection
    Inherits CollectionBase

    Default Public ReadOnly Property Item(ByVal index As Integer) As MyItem
        '省略
    End Property

    'その他諸々省略

End Class

'コレクションメンバ
<TypeConverter(GetType(MyItemConverter))> _
Public Class MyItem

    Public Sub New()
    End Sub

    Public Sub New(ByVal [Text] As String)
        Me.Text = [Text]
    End Sub

    Public Sub New(ByVal [Text] As String, ByVal [Value] As String)
        Me.Text = [Text]
        Me.Value = [Value]
    End Sub

    Public Property Text() As String
        '省略
    End Property

    Public Property Value() As String
        '省略
    End Property

End Class

'コレクションメンバ用型コンバータ
Public Class MyItemConverter
    Inherits System.ComponentModel.TypeConverter

    Public Overloads Overrides Function CanConvertTo(ByVal context As ITypeDescriptorContext, _
        ByVal destinationType As System.Type) As Boolean

        If destinationType Is GetType(InstanceDescriptor) Then
            Return True
        Else
            Return MyBase.CanConvertTo(context, destinationType)
        End If
    End Function

    Public Overloads Overrides Function ConvertTo(ByVal context As ITypeDescriptorContext, _
        ByVal culture As System.Globalization.CultureInfo, _
        ByVal value As Object, _
        ByVal destinationType As System.Type) As Object

        If (destinationType Is GetType(InstanceDescriptor)) Then
            Dim [MyItem] As MyItem = CType(value, MyItem)
            Dim Constructor As Reflection.ConstructorInfo = _
                [MyItem].GetType().GetConstructor(New Type() {GetType(String), GetType(String)})

            Return New InstanceDescriptor(Constructor, New Object() {[MyItem].Text, [MyItem].Value})
        Else
            Return MyBase.ConvertTo(context, culture, value, destinationType)
        End If
    End Function
End Class




詳しくは、「.NET Framework 開発者ガイド」-「型コンバータの実装」にある、実行時にプロパティを初期化するコードを生成する型コンバータの説明を参照して下さい。
1

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